mirror of
https://github.com/nmasur/dotfiles
synced 2026-02-15 12:49:47 +00:00
Compare commits
22 Commits
a978e67346
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7dacb7edf | ||
|
|
dfd3b955c0 | ||
|
|
fd7ddf71f3 | ||
|
|
bba66e3e6a | ||
|
|
be6d6b0d35 | ||
|
|
0239a9925c | ||
|
|
49e35403b6 | ||
|
|
430b522c61 | ||
|
|
a64488093c | ||
|
|
54d2376437 | ||
|
|
cd0a5d5de0 | ||
|
|
10eecfa136 | ||
|
|
b5b3f6cb6a | ||
|
|
810c92a7b8 | ||
|
|
fcb28c8151 | ||
|
|
e2a2d3de14 | ||
|
|
adbc2bd261 | ||
|
|
117fd8a06e | ||
|
|
d9fbdf7bfe | ||
|
|
2d13780d2e | ||
|
|
53a712a217 | ||
|
|
31d34c6540 |
258
flake.lock
generated
258
flake.lock
generated
@@ -1,12 +1,18 @@
|
||||
{
|
||||
"nodes": {
|
||||
"cl-nix-lite": {
|
||||
"inputs": {
|
||||
"flake-parts": "flake-parts",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"systems": "systems",
|
||||
"treefmt-nix": "treefmt-nix"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1728174978,
|
||||
"narHash": "sha256-Grqqg+xuicANB85j0gNEXxi9SBKY7bzGeTuyi95eGcY=",
|
||||
"lastModified": 1766810506,
|
||||
"narHash": "sha256-I4BxozsEu205tA7jazufztI8ZQ5p7hcCnjqrSKPz9nI=",
|
||||
"owner": "hraban",
|
||||
"repo": "cl-nix-lite",
|
||||
"rev": "31cfe6275c341eb3120a99f4b1c8516c49a29d87",
|
||||
"rev": "038e341cede255a83a8f04af114dc95717461d32",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -22,11 +28,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1766038392,
|
||||
"narHash": "sha256-ht/GuKaw5NT3M12xM+mkUtkSBVtzjJ8IHIy6R/ncv9g=",
|
||||
"lastModified": 1770922915,
|
||||
"narHash": "sha256-6J/JoK9iL7sHvKJcGW2KId2agaKv1OGypsa7kN+ZBD4=",
|
||||
"owner": "lnl7",
|
||||
"repo": "nix-darwin",
|
||||
"rev": "5fb45ece6129bd7ad8f7310df0ae9c00bae7c562",
|
||||
"rev": "6c5a56295d2a24e43bcd8af838def1b9a95746b2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -43,11 +49,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1766150702,
|
||||
"narHash": "sha256-P0kM+5o+DKnB6raXgFEk3azw8Wqg5FL6wyl9jD+G5a4=",
|
||||
"lastModified": 1769524058,
|
||||
"narHash": "sha256-zygdD6X1PcVNR2PsyK4ptzrVEiAdbMqLos7utrMDEWE=",
|
||||
"owner": "nix-community",
|
||||
"repo": "disko",
|
||||
"rev": "916506443ecd0d0b4a0f4cf9d40a3c22ce39b378",
|
||||
"rev": "71a3fc97d80881e91710fe721f1158d3b96ae14d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -76,11 +82,11 @@
|
||||
"flake-compat_2": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1765121682,
|
||||
"narHash": "sha256-4VBOP18BFeiPkyhy9o4ssBNQEvfvv1kXkasAYd0+rrA=",
|
||||
"lastModified": 1767039857,
|
||||
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "65f23138d8d09a92e30f1e5c87611b23ef451bf3",
|
||||
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -90,6 +96,24 @@
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1765835352,
|
||||
"narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "a34fae9c08a15ad73f295041fec82323541400a9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts_2": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": [
|
||||
"nur",
|
||||
@@ -132,7 +156,7 @@
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"inputs": {
|
||||
"systems": "systems_2"
|
||||
"systems": "systems_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1731533236,
|
||||
@@ -155,11 +179,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1766171975,
|
||||
"narHash": "sha256-47Ee0bTidhF/3/sHuYnWRuxcCrrm0mBNDxBkOTd3wWQ=",
|
||||
"lastModified": 1771037579,
|
||||
"narHash": "sha256-NX5XuhGcsmk0oEII2PEtMRgvh2KaAv3/WWQsOpxAgR4=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5",
|
||||
"rev": "05e6dc0f6ed936f918cb6f0f21f1dad1e4c53150",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -174,18 +198,16 @@
|
||||
"cl-nix-lite": "cl-nix-lite",
|
||||
"flake-compat": "flake-compat",
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": "systems",
|
||||
"treefmt-nix": "treefmt-nix"
|
||||
"nixpkgs": "nixpkgs_3",
|
||||
"systems": "systems_2",
|
||||
"treefmt-nix": "treefmt-nix_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1756057867,
|
||||
"narHash": "sha256-ziR5eQGqRWhW8tf8r0TIplaqNt+HXu1G1X41LUr4IYo=",
|
||||
"lastModified": 1766810876,
|
||||
"narHash": "sha256-VPElWFQIiP31lXQXEom+L4sl85alZpZn33O4hewsP9k=",
|
||||
"owner": "hraban",
|
||||
"repo": "mac-app-util",
|
||||
"rev": "8414fa1e2cb775b17793104a9095aabeeada63ef",
|
||||
"rev": "4747968574ea58512c5385466400b2364c85d2d0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -238,11 +260,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1764234087,
|
||||
"narHash": "sha256-NHF7QWa0ZPT8hsJrvijREW3+nifmF2rTXgS2v0tpcEA=",
|
||||
"lastModified": 1769813415,
|
||||
"narHash": "sha256-nnVmNNKBi1YiBNPhKclNYDORoHkuKipoz7EtVnXO50A=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixos-generators",
|
||||
"rev": "032a1878682fafe829edfcf5fdfad635a2efe748",
|
||||
"rev": "8946737ff703382fda7623b9fab071d037e897d5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -253,27 +275,42 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1754340878,
|
||||
"narHash": "sha256-lgmUyVQL9tSnvvIvBp7x1euhkkCho7n3TMzgjdvgPoU=",
|
||||
"lastModified": 1766736597,
|
||||
"narHash": "sha256-BASnpCLodmgiVn0M1MU2Pqyoz0aHwar/0qLkp7CjvSQ=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "cab778239e705082fe97bb4990e0d24c50924c04",
|
||||
"rev": "f560ccec6b1116b22e6ed15f4c510997d99d5852",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"ref": "nixos-25.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1765674936,
|
||||
"narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable": {
|
||||
"locked": {
|
||||
"lastModified": 1766014764,
|
||||
"narHash": "sha256-+73VffE5GP5fvbib6Hs1Su6LehG+9UV1Kzs90T2gBLA=",
|
||||
"lastModified": 1767313136,
|
||||
"narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "2b0d2b456e4e8452cf1c16d00118d145f31160f9",
|
||||
"rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -285,11 +322,59 @@
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1766070988,
|
||||
"narHash": "sha256-G/WVghka6c4bAzMhTwT2vjLccg/awmHkdKSd2JrycLc=",
|
||||
"lastModified": 1761236834,
|
||||
"narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "c6245e83d836d0433170a16eb185cefe0572f8b8",
|
||||
"rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1732617236,
|
||||
"narHash": "sha256-PYkz6U0bSEaEB1al7O1XsqVNeSNS+s3NVclJw7YC43w=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "af51545ec9a44eadf3fe3547610a5cdd882bc34e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "af51545ec9a44eadf3fe3547610a5cdd882bc34e",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_4": {
|
||||
"locked": {
|
||||
"lastModified": 1761236834,
|
||||
"narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_5": {
|
||||
"locked": {
|
||||
"lastModified": 1770841267,
|
||||
"narHash": "sha256-9xejG0KoqsoKEGp2kVbXRlEYtFFcDTHjidiuX8hGO44=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ec7c70d12ce2fc37cb92aff673dcdca89d187bae",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -299,7 +384,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"nixpkgs_6": {
|
||||
"locked": {
|
||||
"lastModified": 1744536153,
|
||||
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
|
||||
@@ -317,17 +402,17 @@
|
||||
},
|
||||
"nur": {
|
||||
"inputs": {
|
||||
"flake-parts": "flake-parts",
|
||||
"flake-parts": "flake-parts_2",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1766202981,
|
||||
"narHash": "sha256-Nzt9KaALJSMBoPOQLc0cu6ODTncGqmK8mIf/0JCKN5w=",
|
||||
"lastModified": 1771044752,
|
||||
"narHash": "sha256-9pnZltSDksIepwd1PJIskZKXTGQzdElS/zK/qnlj2uU=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nur",
|
||||
"rev": "e036ffaac9c2869ab23d4fb1c0d9da50fe2f852a",
|
||||
"rev": "40fb292376611e388cb14329c96853966f57763a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -344,7 +429,7 @@
|
||||
"mac-app-util": "mac-app-util",
|
||||
"nix2vim": "nix2vim",
|
||||
"nixos-generators": "nixos-generators",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"nixpkgs": "nixpkgs_5",
|
||||
"nixpkgs-stable": "nixpkgs-stable",
|
||||
"nur": "nur",
|
||||
"rust-overlay": "rust-overlay",
|
||||
@@ -355,14 +440,14 @@
|
||||
},
|
||||
"rust-overlay": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_3"
|
||||
"nixpkgs": "nixpkgs_6"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1766198367,
|
||||
"narHash": "sha256-f1L1rCEu2Zew6zdiZ38jJDZd65ktE7UN+Gqn2LHPiFI=",
|
||||
"lastModified": 1771038269,
|
||||
"narHash": "sha256-TygYZ7JhnJbRoWOk7d5HaA/GhEVCvtRruN7TqaN9s/c=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "66bb33fdfb50b1ee724381c3f5d6012dac6c89b3",
|
||||
"rev": "d7a86c8a4df49002446737603a3e0d7ef91a9637",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -372,21 +457,6 @@
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1689347925,
|
||||
"narHash": "sha256-ozenz5bFe1UUqOn7f60HRmgc01BgTGIKZ4Xl+HbocGQ=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-darwin",
|
||||
"rev": "2235d7e6cc29ae99878133c95e9fe5e157661ffb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-darwin",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_2": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
@@ -401,6 +471,21 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_2": {
|
||||
"locked": {
|
||||
"lastModified": 1689347925,
|
||||
"narHash": "sha256-ozenz5bFe1UUqOn7f60HRmgc01BgTGIKZ4Xl+HbocGQ=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-darwin",
|
||||
"rev": "2235d7e6cc29ae99878133c95e9fe5e157661ffb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-darwin",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_3": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
@@ -416,16 +501,49 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_4": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"treefmt-nix": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1755934250,
|
||||
"narHash": "sha256-CsDojnMgYsfshQw3t4zjRUkmMmUdZGthl16bXVWgRYU=",
|
||||
"lastModified": 1766000401,
|
||||
"narHash": "sha256-+cqN4PJz9y0JQXfAK5J1drd0U05D5fcAGhzhfVrDlsI=",
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"rev": "74e1a52d5bd9430312f8d1b8b0354c92c17453e5",
|
||||
"rev": "42d96e75aa56a3f70cab7e7dc4a32868db28e8fd",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"treefmt-nix_2": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_4"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1766000401,
|
||||
"narHash": "sha256-+cqN4PJz9y0JQXfAK5J1drd0U05D5fcAGhzhfVrDlsI=",
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"rev": "42d96e75aa56a3f70cab7e7dc4a32868db28e8fd",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -442,11 +560,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1765841014,
|
||||
"narHash": "sha256-55V0AJ36V5Egh4kMhWtDh117eE3GOjwq5LhwxDn9eHg=",
|
||||
"lastModified": 1770657009,
|
||||
"narHash": "sha256-v/LA5ZSJ+JQYzMSKB4sySM0wKfsAqddNzzxLLnbsV/E=",
|
||||
"owner": "nix-community",
|
||||
"repo": "NixOS-WSL",
|
||||
"rev": "be4af8042e7a61fa12fda58fe9a3b3babdefe17b",
|
||||
"rev": "5b50ea1aaa14945d4794c80fcc99c4aa1db84d2d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -463,7 +581,7 @@
|
||||
"rust-overlay": [
|
||||
"rust-overlay"
|
||||
],
|
||||
"systems": "systems_3"
|
||||
"systems": "systems_4"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1742588229,
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
# Better App install management in macOS
|
||||
mac-app-util = {
|
||||
url = "github:hraban/mac-app-util";
|
||||
inputs.nixpkgs.follows = "nixpkgs"; # Use system packages list for their inputs
|
||||
# inputs.nixpkgs.follows = "nixpkgs"; # Use system packages list for their inputs
|
||||
};
|
||||
|
||||
# Manage disk format and partitioning
|
||||
@@ -132,6 +132,7 @@
|
||||
mathesar = "mathesar.${baseName}";
|
||||
metrics = "metrics.${baseName}";
|
||||
minecraft = "minecraft.${baseName}";
|
||||
mumble = "mumble.${baseName}";
|
||||
n8n = "n8n.${baseName}";
|
||||
navidrome = "music.${baseName}";
|
||||
notifications = "ntfy.${baseName}";
|
||||
@@ -287,7 +288,7 @@
|
||||
inherit (lib) overlays;
|
||||
};
|
||||
in
|
||||
pkgs.nixfmt-rfc-style
|
||||
pkgs.nixfmt
|
||||
);
|
||||
|
||||
# Templates for starting other projects quickly
|
||||
|
||||
5
overlays/firefox.nix
Normal file
5
overlays/firefox.nix
Normal file
@@ -0,0 +1,5 @@
|
||||
inputs: final: prev: {
|
||||
|
||||
firefox-unwrapped = final.stable.firefox-unwrapped;
|
||||
|
||||
}
|
||||
@@ -5,7 +5,7 @@ inputs: _final: prev: {
|
||||
# Provides `pkgs.stable`.
|
||||
stable = import inputs.nixpkgs-stable {
|
||||
system = prev.stdenv.hostPlatform.system;
|
||||
inherit (prev) config;
|
||||
config = { };
|
||||
overlays = [
|
||||
# inputs.self.overlays.vim-plugins
|
||||
];
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
lua.command = "${pkgs.stylua}/bin/stylua";
|
||||
black.command = "${pkgs.black}/bin/black";
|
||||
fish_indent.command = "${pkgs.fish}/bin/fish_indent";
|
||||
nixfmt.command = "${pkgs.nixfmt-rfc-style}/bin/nixfmt";
|
||||
nixfmt.command = "${pkgs.nixfmt}/bin/nixfmt";
|
||||
rustfmt.command = "${pkgs.rustfmt}/bin/rustfmt";
|
||||
shfmt = {
|
||||
command = "${pkgs.shfmt}/bin/shfmt";
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
|
||||
plugins = [
|
||||
(pkgs.vimPlugins.nvim-treesitter.withPlugins (_plugins: [
|
||||
pkgs.nmasur.ini-grammar
|
||||
pkgs.nmasur.puppet-grammar
|
||||
pkgs.nmasur.rasi-grammar
|
||||
pkgs.nmasur.vimdoc-grammar
|
||||
pkgs.nmasur.tree-sitter-ini
|
||||
pkgs.nmasur.tree-sitter-puppet
|
||||
pkgs.nmasur.tree-sitter-rasi
|
||||
pkgs.nmasur.tree-sitter-vimdoc
|
||||
pkgs.tree-sitter-grammars.tree-sitter-bash
|
||||
pkgs.tree-sitter-grammars.tree-sitter-c
|
||||
pkgs.tree-sitter-grammars.tree-sitter-fish
|
||||
@@ -21,7 +21,6 @@
|
||||
pkgs.tree-sitter-grammars.tree-sitter-yaml
|
||||
]))
|
||||
pkgs.vimPlugins.vim-matchup # Better % jumping in languages
|
||||
pkgs.vimPlugins.playground # Tree-sitter experimenting
|
||||
pkgs.vimPlugins.nginx-vim
|
||||
pkgs.vimPlugins.vim-helm
|
||||
# pkgs.vimPlugins.hmts-nvim # Tree-sitter injections for home-manager
|
||||
|
||||
@@ -18,5 +18,5 @@
|
||||
}).withPlugins
|
||||
{
|
||||
plugins = [ "github.com/caddy-dns/cloudflare@v0.2.1" ];
|
||||
hash = "sha256-iRzpN9awuEFsc7hqKzOMNiCFFEv833xhd4LM+VFQedI=";
|
||||
hash = "sha256-Zls+5kWd/JSQsmZC4SRQ/WS+pUcRolNaaI7UQoPzJA0=";
|
||||
}
|
||||
|
||||
41
pkgs/firefox-history-exporter/background.js
Normal file
41
pkgs/firefox-history-exporter/background.js
Normal file
@@ -0,0 +1,41 @@
|
||||
|
||||
function exportHistory() {
|
||||
const now = new Date();
|
||||
const startTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0); // Beginning of today
|
||||
|
||||
browser.history.search({
|
||||
text: '',
|
||||
startTime: startTime,
|
||||
endTime: now,
|
||||
maxResults: 10000
|
||||
}).then(historyItems => {
|
||||
const historyData = JSON.stringify(historyItems, null, 2);
|
||||
const blob = new Blob([historyData], {type: 'application/json'});
|
||||
const url = URL.createObjectURL(blob);
|
||||
const date = now.toISOString().slice(0, 10); // YYYY-MM-DD
|
||||
const filename = `firefox-history/history-${date}.json`;
|
||||
|
||||
browser.downloads.download({
|
||||
url: url,
|
||||
filename: filename,
|
||||
conflictAction: 'overwrite',
|
||||
saveAs: false
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
browser.alarms.create('daily-export', {
|
||||
periodInMinutes: 60 // every 1 hour
|
||||
});
|
||||
|
||||
browser.alarms.onAlarm.addListener(alarm => {
|
||||
if (alarm.name === 'daily-export') {
|
||||
exportHistory();
|
||||
}
|
||||
});
|
||||
|
||||
browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
||||
if (message.command === "exportHistory") {
|
||||
exportHistory();
|
||||
}
|
||||
});
|
||||
25
pkgs/firefox-history-exporter/manifest.json
Normal file
25
pkgs/firefox-history-exporter/manifest.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"manifest_version": 3,
|
||||
"name": "History Exporter",
|
||||
"version": "1.1",
|
||||
"description": "Automatically exports today's browsing history.",
|
||||
"permissions": [
|
||||
"history",
|
||||
"downloads",
|
||||
"alarms"
|
||||
],
|
||||
"background": {
|
||||
"scripts": ["background.js"]
|
||||
},
|
||||
"action": {
|
||||
"default_popup": "popup.html"
|
||||
},
|
||||
"browser_specific_settings": {
|
||||
"gecko": {
|
||||
"id": "firefox-history-exporter@nmasur.com",
|
||||
"data_collection_permissions": {
|
||||
"required": ["none"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
26
pkgs/firefox-history-exporter/package.nix
Normal file
26
pkgs/firefox-history-exporter/package.nix
Normal file
@@ -0,0 +1,26 @@
|
||||
{ pkgs, ... }:
|
||||
|
||||
pkgs.stdenv.mkDerivation rec {
|
||||
pname = "firefox-history-exporter";
|
||||
version = "1.1";
|
||||
src = ./.;
|
||||
|
||||
nativeBuildInputs = [ pkgs.zip ];
|
||||
|
||||
dontUnpack = true;
|
||||
|
||||
installPhase = ''
|
||||
dst="$out/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
|
||||
mkdir -p "$dst"
|
||||
zip -j "$dst/firefox-history-exporter@nmasur.com.xpi" \
|
||||
"${src}/manifest.json" \
|
||||
"${src}/background.js" \
|
||||
"${src}/popup.html" \
|
||||
"${src}/popup.js"
|
||||
'';
|
||||
|
||||
meta = with pkgs.lib; {
|
||||
description = "Automatically exports today's browsing history.";
|
||||
license = licenses.mit;
|
||||
};
|
||||
}
|
||||
25
pkgs/firefox-history-exporter/popup.html
Normal file
25
pkgs/firefox-history-exporter/popup.html
Normal file
@@ -0,0 +1,25 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>History Exporter</title>
|
||||
<style>
|
||||
body {
|
||||
width: 200px;
|
||||
text-align: center;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
button {
|
||||
margin-top: 10px;
|
||||
padding: 10px;
|
||||
font-size: 16px;
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>History Exporter</h1>
|
||||
<button id="export-button">Export Now</button>
|
||||
<p id="status"></p>
|
||||
<script src="popup.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
9
pkgs/firefox-history-exporter/popup.js
Normal file
9
pkgs/firefox-history-exporter/popup.js
Normal file
@@ -0,0 +1,9 @@
|
||||
document.getElementById('export-button').addEventListener('click', () => {
|
||||
browser.runtime.sendMessage({command: "exportHistory"});
|
||||
|
||||
const statusElement = document.getElementById('status');
|
||||
statusElement.textContent = 'Exporting...';
|
||||
setTimeout(() => {
|
||||
statusElement.textContent = 'Export complete!';
|
||||
}, 2000);
|
||||
});
|
||||
@@ -5,7 +5,7 @@ pkgs.mkShell {
|
||||
buildInputs = with pkgs; [
|
||||
git
|
||||
stylua
|
||||
nixfmt-rfc-style
|
||||
nixfmt
|
||||
shfmt
|
||||
shellcheck
|
||||
];
|
||||
|
||||
@@ -32,7 +32,6 @@ in
|
||||
config = lib.mkIf cfg.enable {
|
||||
|
||||
accounts.calendar.accounts.default = {
|
||||
basePath = "other/calendars"; # Where to save calendars in ~ directory
|
||||
name = "personal";
|
||||
local.type = "filesystem";
|
||||
primary = true;
|
||||
|
||||
@@ -46,6 +46,8 @@ in
|
||||
ublacklist
|
||||
vimium
|
||||
wappalyzer # TODO: only for work profile
|
||||
pkgs.nmasur.firefox-history-exporter
|
||||
# copy-as-markdown
|
||||
# saml-tracer
|
||||
# text-fragment
|
||||
];
|
||||
@@ -61,6 +63,7 @@ in
|
||||
"trailhead.firstrun.didSeeAboutWelcome" = true; # Disable welcome splash
|
||||
"dom.forms.autocomplete.formautofill" = false; # Disable autofill
|
||||
"extensions.formautofill.creditCards.enabled" = false; # Disable credit cards
|
||||
"extensions.autoDisableScopes" = false; # Enable extensions automatically
|
||||
"dom.payments.defaults.saveAddress" = false; # Disable address save
|
||||
"general.autoScroll" = true; # Drag middle-mouse to scroll
|
||||
"services.sync.prefs.sync.general.autoScroll" = false; # Prevent disabling autoscroll
|
||||
@@ -187,7 +190,7 @@ in
|
||||
xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
|
||||
"${config.xsession.windowManager.i3.config.modifier}+Shift+b" = "exec ${
|
||||
# Don't name the script `firefox` or it will affect grep
|
||||
builtins.toString (
|
||||
toString (
|
||||
pkgs.writeShellScript "focus-ff.sh" ''
|
||||
count=$(ps aux | grep -c firefox)
|
||||
if [ "$count" -eq 1 ]; then
|
||||
|
||||
@@ -22,7 +22,6 @@ in
|
||||
extensions = [
|
||||
pkgs.nmasur.gh-collaborators
|
||||
pkgs.gh-dash
|
||||
pkgs.gh-copilot
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
@@ -347,7 +347,7 @@ in
|
||||
|
||||
};
|
||||
|
||||
themes."${config.programs.helix.settings.theme}" = {
|
||||
themes.base16 = {
|
||||
"attributes" = config.theme.colors.base09;
|
||||
"comment" = {
|
||||
fg = config.theme.colors.base03;
|
||||
@@ -527,6 +527,197 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
themes.alabaster-style = {
|
||||
"attribute" = config.theme.colors.base05;
|
||||
"comment" = {
|
||||
fg = config.theme.colors.base0A;
|
||||
# modifiers = [ "italic" ];
|
||||
};
|
||||
"constant" = config.theme.colors.base0E;
|
||||
"constant.numeric" = config.theme.colors.base0E;
|
||||
"constant.builtin" = config.theme.colors.base0E;
|
||||
"constant.character" = config.theme.colors.base0E;
|
||||
"constant.character.escape" = config.theme.colors.base0C;
|
||||
"constructor" = config.theme.colors.base0D;
|
||||
"debug" = config.theme.colors.base03;
|
||||
"diagnostic" = {
|
||||
modifiers = [ "underlined" ];
|
||||
};
|
||||
"diff.delta" = config.theme.colors.base09;
|
||||
"diff.minus" = config.theme.colors.base08;
|
||||
"diff.plus" = config.theme.colors.base0B;
|
||||
"error" = config.theme.colors.base08;
|
||||
"function" = config.theme.colors.base0D;
|
||||
"hint" = config.theme.colors.base03;
|
||||
"info" = config.theme.colors.base0D;
|
||||
"keyword" = config.theme.colors.base05;
|
||||
"keyword.control" = config.theme.colors.base05;
|
||||
"keyword.operator" = config.theme.colors.base05;
|
||||
"label" = config.theme.colors.base0E;
|
||||
"namespace" = config.theme.colors.base0E;
|
||||
"operator" = config.theme.colors.base05;
|
||||
"punctuation" = config.theme.colors.base04;
|
||||
"punctuation.bracket" = config.theme.colors.base04;
|
||||
"punctuation.delimiter" = config.theme.colors.base04;
|
||||
"special" = config.theme.colors.base0D;
|
||||
"string" = config.theme.colors.base0B;
|
||||
"string.regexp" = config.theme.colors.base0B;
|
||||
"string.special" = config.theme.colors.base0C;
|
||||
"type" = config.theme.colors.base0A;
|
||||
"variable" = config.theme.colors.base05;
|
||||
"variable.parameter" = config.theme.colors.base05;
|
||||
"variable.builtin" = config.theme.colors.base05;
|
||||
"variable.other.member" = config.theme.colors.base05;
|
||||
"warning" = config.theme.colors.base09;
|
||||
"markup.bold" = {
|
||||
fg = config.theme.colors.base0A;
|
||||
modifiers = [ "bold" ];
|
||||
};
|
||||
"markup.heading" = config.theme.colors.base0D;
|
||||
"markup.italic" = {
|
||||
fg = config.theme.colors.base0E;
|
||||
modifiers = [ "italic" ];
|
||||
};
|
||||
"markup.link.text" = config.theme.colors.base08;
|
||||
"markup.link.url" = {
|
||||
fg = config.theme.colors.base09;
|
||||
modifiers = [ "underlined" ];
|
||||
};
|
||||
"markup.list" = config.theme.colors.base08;
|
||||
"markup.quote" = config.theme.colors.base0C;
|
||||
"markup.raw" = config.theme.colors.base0B;
|
||||
"markup.strikethrough" = {
|
||||
modifiers = [ "crossed_out" ];
|
||||
};
|
||||
"diagnostic.hint" = {
|
||||
underline = {
|
||||
style = "curl";
|
||||
};
|
||||
};
|
||||
"diagnostic.info" = {
|
||||
underline = {
|
||||
style = "curl";
|
||||
};
|
||||
};
|
||||
"diagnostic.warning" = {
|
||||
underline = {
|
||||
style = "curl";
|
||||
};
|
||||
};
|
||||
"diagnostic.error" = {
|
||||
underline = {
|
||||
style = "curl";
|
||||
};
|
||||
};
|
||||
"ui.background" = {
|
||||
bg = config.theme.colors.base00;
|
||||
};
|
||||
"ui.bufferline.active" = {
|
||||
fg = config.theme.colors.base00;
|
||||
bg = config.theme.colors.base03;
|
||||
modifiers = [ "bold" ];
|
||||
};
|
||||
"ui.bufferline" = {
|
||||
fg = config.theme.colors.base04;
|
||||
bg = config.theme.colors.base00;
|
||||
};
|
||||
"ui.cursor" = {
|
||||
fg = config.theme.colors.base04;
|
||||
modifiers = [ "reversed" ];
|
||||
};
|
||||
"ui.cursor.insert" = {
|
||||
fg = config.theme.colors.base0A;
|
||||
modifiers = [ "reversed" ];
|
||||
};
|
||||
"ui.cursorline.primary" = {
|
||||
fg = config.theme.colors.base05;
|
||||
bg = config.theme.colors.base01;
|
||||
};
|
||||
"ui.cursor.match" = {
|
||||
fg = config.theme.colors.base03;
|
||||
modifiers = [ "reversed" ];
|
||||
};
|
||||
"ui.cursor.select" = {
|
||||
fg = config.theme.colors.base04;
|
||||
modifiers = [ "reversed" ];
|
||||
};
|
||||
"ui.gutter" = {
|
||||
bg = config.theme.colors.base00;
|
||||
};
|
||||
"ui.help" = {
|
||||
fg = config.theme.colors.base06;
|
||||
bg = config.theme.colors.base01;
|
||||
};
|
||||
"ui.linenr" = {
|
||||
fg = config.theme.colors.base03;
|
||||
bg = config.theme.colors.base00;
|
||||
};
|
||||
"ui.linenr.selected" = {
|
||||
fg = config.theme.colors.base04;
|
||||
bg = config.theme.colors.base01;
|
||||
modifiers = [ "bold" ];
|
||||
};
|
||||
"ui.menu" = {
|
||||
fg = config.theme.colors.base05;
|
||||
bg = config.theme.colors.base01;
|
||||
};
|
||||
"ui.menu.scroll" = {
|
||||
fg = config.theme.colors.base03;
|
||||
bg = config.theme.colors.base01;
|
||||
};
|
||||
"ui.menu.selected" = {
|
||||
fg = config.theme.colors.base01;
|
||||
bg = config.theme.colors.base04;
|
||||
};
|
||||
"ui.popup" = {
|
||||
bg = config.theme.colors.base01;
|
||||
};
|
||||
"ui.selection" = {
|
||||
bg = config.theme.colors.base01;
|
||||
};
|
||||
"ui.selection.primary" = {
|
||||
bg = config.theme.colors.base02;
|
||||
};
|
||||
"ui.statusline" = {
|
||||
fg = config.theme.colors.base04;
|
||||
bg = config.theme.colors.base01;
|
||||
};
|
||||
"ui.statusline.inactive" = {
|
||||
bg = config.theme.colors.base01;
|
||||
fg = config.theme.colors.base03;
|
||||
};
|
||||
"ui.statusline.insert" = {
|
||||
fg = config.theme.colors.base00;
|
||||
bg = config.theme.colors.base0B;
|
||||
};
|
||||
"ui.statusline.normal" = {
|
||||
fg = config.theme.colors.base00;
|
||||
bg = config.theme.colors.base03;
|
||||
};
|
||||
"ui.statusline.select" = {
|
||||
fg = config.theme.colors.base00;
|
||||
bg = config.theme.colors.base0F;
|
||||
};
|
||||
"ui.text" = config.theme.colors.base05;
|
||||
"ui.text.focus" = config.theme.colors.base05;
|
||||
"ui.virtual.indent-guide" = {
|
||||
fg = config.theme.colors.base03;
|
||||
};
|
||||
"ui.virtual.inlay-hint" = {
|
||||
fg = config.theme.colors.base03;
|
||||
};
|
||||
"ui.virtual.ruler" = {
|
||||
bg = config.theme.colors.base01;
|
||||
};
|
||||
"ui.virtual.jump-label" = {
|
||||
fg = config.theme.colors.base0A;
|
||||
modifiers = [ "bold" ];
|
||||
};
|
||||
"ui.window" = {
|
||||
bg = config.theme.colors.base01;
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
# Create a desktop option for launching Helix from a file manager
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
-----BEGIN AGE ENCRYPTED FILE-----
|
||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBTYTRy
|
||||
elYzTGpSNDQ3UEcwTXlVeGJleUJmWWhaeDdDQTFRcGpmNlNrQlNVCjA5L2JrS3Vx
|
||||
Q0cyRkk5dTBLOHJXa0xJSG9MTDFnNjV1M0F5L3F5RUlVbW8KLT4gc3NoLWVkMjU1
|
||||
MTkgWXlTVU1RIG5vNm1Xem9lN2pkS25WRi9xSlpZUjhuYmdUVDUvc2o4M0xqYURR
|
||||
UmY0VGcKWVVQc2wyV0Jqbk9JR3N4bW5HOXFTZHpCa25EMC85eThQY05MdHdaeXZy
|
||||
VQotPiBzc2gtZWQyNTUxOSBuanZYNUEgWXRVa3c4STZ3WmFaNThSdE1QdVpiMVR1
|
||||
cm5hYXJsckZiRGtXLzN5RzJEawpkVHBscFd2c0R1SGxnZ3lKUnNnMEZtTUxoQlB4
|
||||
dVBEbTkvUzBJSVRiV1hBCi0+IHNzaC1lZDI1NTE5IENxSU9VQSAvQjhVam1heHNU
|
||||
elVrVGtvaUx1elFCeTdNTkRnN3c5NEc5MWg4dDU3NUhzCm5sUlhHclJrNldnVDhF
|
||||
MTV2cGd3ZFhFdm1rM2ExWVFXbkNJYWlWY0VnUmsKLT4gc3NoLWVkMjU1MTkgejFP
|
||||
Y1p3IGc1QUdkZEp0Z0xEekFjcHd4WVFVam9BZTBEQm9NR3QzQmxNS09VVXpHV2sK
|
||||
c2tYSElVK2prRlF3VlFqKzlVUFRHUWU3TmFXcEdsV2FKWVhKT3pWZkxVNAotLS0g
|
||||
c1cxdk5sL1c3dDZuVGp5VWJrTlBGZTByNjRxMGxTdHd0NFNHV1pyN2k5Ywr7SW9q
|
||||
/FaTTUHB5QiCihA+385sNogq7Q1RvgT2Dwn9NdmMRd/ObESbokJXVSiDDEt6d39s
|
||||
D/uoDY20p3PCk4julNn1
|
||||
-----END AGE ENCRYPTED FILE-----
|
||||
@@ -0,0 +1,106 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
|
||||
let
|
||||
inherit (config.nmasur.settings) hostnames;
|
||||
cfg = config.nmasur.presets.programs.thunderbird;
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
options.nmasur.presets.programs.thunderbird = {
|
||||
enable = lib.mkEnableOption "Thunderbird email client";
|
||||
calendar = {
|
||||
username = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Username for the calendar service backend";
|
||||
default = config.nmasur.settings.username;
|
||||
};
|
||||
passwordCommand = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Password for the calendar service backend";
|
||||
default = config.accounts.email.accounts.home.passwordCommand;
|
||||
};
|
||||
hostname = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Hostname for the calendar service backend";
|
||||
default = hostnames.content;
|
||||
};
|
||||
url = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "URL for the calendar service backend";
|
||||
default = "https://${cfg.calendar.hostname}/remote.php/dav";
|
||||
};
|
||||
};
|
||||
tasks = {
|
||||
username = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Username for the tasks service backend";
|
||||
default = config.nmasur.settings.username;
|
||||
};
|
||||
passwordCommand = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Password for the tasks service backend";
|
||||
default = "${lib.getExe pkgs.age} --decrypt --identity ~/.ssh/id_ed25519 ${pkgs.writeText "taskspass.age" (builtins.readFile ./taskspass.age)}";
|
||||
};
|
||||
hostname = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Hostname for the tasks service backend";
|
||||
default = hostnames.content;
|
||||
};
|
||||
url = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "URL for the tasks service backend";
|
||||
default = "https://${cfg.tasks.hostname}/remote.php/dav";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
|
||||
programs.thunderbird = {
|
||||
enable = true;
|
||||
profiles.default = {
|
||||
isDefault = true;
|
||||
};
|
||||
};
|
||||
accounts.email.accounts.home.thunderbird = {
|
||||
enable = true;
|
||||
profiles = [ "default" ];
|
||||
};
|
||||
accounts.calendar.basePath = "other/calendars"; # Where to save calendars in ~ directory
|
||||
# accounts.calendar.accounts.home = {
|
||||
# local.type = "filesystem";
|
||||
# primary = true;
|
||||
# remote = {
|
||||
# passwordCommand = [ cfg.calendar.passwordCommand ];
|
||||
# type = "caldav";
|
||||
# url = cfg.calendar.url;
|
||||
# userName = cfg.calendar.username;
|
||||
# };
|
||||
# thunderbird = {
|
||||
# enable = true;
|
||||
# profiles = [ "default" ];
|
||||
# };
|
||||
# };
|
||||
# accounts.calendar.accounts.tasks = {
|
||||
# local.type = "filesystem";
|
||||
# primary = false;
|
||||
# remote = {
|
||||
# passwordCommand = [ cfg.tasks.passwordCommand ];
|
||||
# type = "caldav";
|
||||
# url = cfg.tasks.url;
|
||||
# userName = cfg.tasks.username;
|
||||
# };
|
||||
# thunderbird = {
|
||||
# enable = true;
|
||||
# profiles = [ "default" ];
|
||||
# };
|
||||
# };
|
||||
|
||||
};
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
}:
|
||||
|
||||
let
|
||||
inherit (config.nmasur.settings) username;
|
||||
cfg = config.nmasur.presets.programs.zellij;
|
||||
|
||||
zellij-switch-to-last = pkgs.writeShellScriptBin "zellij-switch-to-last" ''
|
||||
@@ -127,7 +128,7 @@ in
|
||||
if pkgs.stdenv.isDarwin then
|
||||
[
|
||||
"env"
|
||||
"PATH=${config.home.homeDirectory}/.nix-profile/bin:/usr/bin:/bin"
|
||||
"PATH=/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin:/usr/bin:/bin"
|
||||
(lib.getExe zellij-switch-to-last)
|
||||
]
|
||||
else
|
||||
@@ -199,7 +200,7 @@ in
|
||||
if pkgs.stdenv.isDarwin then
|
||||
[
|
||||
"env"
|
||||
"PATH=${config.home.homeDirectory}/.nix-profile/bin:/usr/bin"
|
||||
"PATH=${config.home.homeDirectory}/.nix-profile/bin:/etc/profiles/per-user/${username}/bin:/usr/bin"
|
||||
(lib.getExe pkgs.jjui)
|
||||
]
|
||||
else
|
||||
@@ -270,6 +271,16 @@ in
|
||||
_args = [ "Left" ];
|
||||
};
|
||||
};
|
||||
"bind \"Alt j\"" = {
|
||||
MoveFocus = {
|
||||
_args = [ "Down" ];
|
||||
};
|
||||
};
|
||||
"bind \"Alt k\"" = {
|
||||
MoveFocus = {
|
||||
_args = [ "Up" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
@@ -27,6 +27,9 @@ in
|
||||
pkgs.skate # Key-value store
|
||||
pkgs.charm # Manage account and filesystem
|
||||
pkgs.pop # Send emails from a TUI
|
||||
pkgs.snitch # Network
|
||||
pkgs.comma # Nix-index auto-launch
|
||||
pkgs.nix-inspect # TUI for browsing Nix configs
|
||||
|
||||
pkgs.crush # AI LLM Agent
|
||||
pkgs.gemini-cli # AI LLM Agent
|
||||
|
||||
@@ -32,6 +32,7 @@ in
|
||||
nsxiv.enable = lib.mkDefault true;
|
||||
obsidian.enable = lib.mkDefault true;
|
||||
rofi.enable = lib.mkDefault true;
|
||||
thunderbird.enable = lib.mkDefault true;
|
||||
xclip.enable = lib.mkDefault true;
|
||||
zathura.enable = lib.mkDefault true;
|
||||
};
|
||||
|
||||
@@ -26,7 +26,7 @@ in
|
||||
pkgs.jless # JSON viewer
|
||||
pkgs.jo # JSON output
|
||||
pkgs.mpd # TUI slideshows
|
||||
pkgs.nixfmt-rfc-style # Format Nix code
|
||||
pkgs.nixfmt # Format Nix code
|
||||
pkgs.nmasur.jqr # FZF fq JSON tool
|
||||
pkgs.nmasur.osc # Clipboard over SSH
|
||||
pkgs.nmasur.ren-find # Rename files
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
|
||||
let
|
||||
inherit (config.nmasur.settings) username;
|
||||
cfg = config.nmasur.presets.services.daily-summary;
|
||||
|
||||
# Remove process urls in favor of using extention
|
||||
# process_urls = pkgs.writers.writePython3Bin "process-urls" {
|
||||
# libraries = [
|
||||
# pkgs.python3Packages.requests
|
||||
# pkgs.python3Packages.beautifulsoup4
|
||||
# ];
|
||||
# } (builtins.readFile ./process-urls.py);
|
||||
# prompt = "Based on my browser usage for today from the markdown file located in /Users/${username}/Downloads/Sidebery/todays_urls.md, create or update a daily summary markdown file in the generated notes directory located in /Users/${username}/dev/personal/notes/generated/ with the filename format 'YYYY-MM-DD Daily Summary.md'. The resulting markdown file should use /Users/${username}/dev/personal/notes/templates/generated-summary.md as a format template, and it should summarize where I have spent my time today and highlight any notable links that I have visited. Please create markdown links to other relevant notes in /Users/${username}/dev/personal/notes/. If there is an existing markdown file for today, update it to include the newest information.";
|
||||
prompt = "Based on my browser usage for today from the JSON file located in /Users/${username}/Downloads/firefox-history/history-YYYY-MM-DD.json, create or update a daily summary markdown file in the generated notes directory located in /Users/${username}/dev/personal/notes/generated/ with the filename format 'YYYY-MM-DD Daily Summary.md'. If the JSON file for today doesn't exist, exit. The resulting markdown file should use /Users/${username}/dev/personal/notes/templates/generated-summary.md as a format template, and it should summarize where I have spent my time today and highlight any notable pages that I have visited, using the titles of each URL in the JSON file for markdown links. Please create markdown links to other relevant notes in /Users/${username}/dev/personal/notes/ and explain why they are being referenced. If there is an existing markdown file for today, update it to include the newest information.";
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
options.nmasur.presets.services.daily-summary.enable = lib.mkEnableOption "Daily work summary";
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
launchd.user.agents.daily-summary = {
|
||||
# This replaces program and args entirely
|
||||
# script = ''
|
||||
# ${process_urls}/bin/process-urls /Users/${username}/Downloads/Sidebery/
|
||||
# GEMINI_API_KEY=$(cat /Users/${username}/.config/gemini/.gemini_api_key) ${pkgs.gemini-cli}/bin/gemini --allowed-tools all --yolo --include-directories /Users/${username}/Downloads/Sidebery/ --include-directories /Users/${username}/dev/personal/notes/ "${prompt}"
|
||||
# '';
|
||||
script = ''
|
||||
GEMINI_API_KEY=$(cat /Users/${username}/.config/gemini/.gemini_api_key) ${pkgs.gemini-cli}/bin/gemini --allowed-tools all --yolo --include-directories "/Users/${username}/Downloads/firefox-history/,/Users/${username}/dev/personal/notes/" "${prompt} | tee -a /Users/${username}/dev/personal/gemini-archive/daily-summary-logs/$(date +"%Y-%m-%d").log"
|
||||
'';
|
||||
|
||||
path = [
|
||||
pkgs.bash
|
||||
pkgs.coreutils
|
||||
];
|
||||
|
||||
serviceConfig = {
|
||||
Label = "com.example.daily-summary";
|
||||
# Runs the script through /bin/sh automatically
|
||||
# RunAtLoad = true;
|
||||
StartCalendarInterval = [
|
||||
{
|
||||
Hour = 4;
|
||||
Minute = 45;
|
||||
}
|
||||
{
|
||||
Hour = 6;
|
||||
Minute = 0;
|
||||
}
|
||||
{
|
||||
Hour = 9;
|
||||
Minute = 0;
|
||||
}
|
||||
{
|
||||
Hour = 11;
|
||||
Minute = 0;
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
# Temporarily disabled in favor of using an extension to save history
|
||||
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime
|
||||
from urllib.parse import urlparse
|
||||
|
||||
|
||||
def find_urls(data):
|
||||
urls = []
|
||||
if isinstance(data, dict):
|
||||
for key, value in data.items():
|
||||
if key == 'url' and isinstance(value, str):
|
||||
urls.append(value)
|
||||
else:
|
||||
urls.extend(find_urls(value))
|
||||
elif isinstance(data, list):
|
||||
for item in data:
|
||||
urls.extend(find_urls(item))
|
||||
return urls
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) > 1:
|
||||
base_dir = sys.argv[1]
|
||||
if not os.path.isdir(base_dir):
|
||||
print(f"Error: Directory '{base_dir}' not found.")
|
||||
sys.exit(1)
|
||||
else:
|
||||
base_dir = '.'
|
||||
|
||||
today = datetime.now().strftime('%Y.%m.%d')
|
||||
output_filename = 'todays_urls.md'
|
||||
output_filepath = os.path.join(base_dir, output_filename)
|
||||
url_titles = {}
|
||||
|
||||
print(f"Searching for files in '{base_dir}' "
|
||||
f"starting with 'snapshot-{today}-'")
|
||||
|
||||
with open(output_filepath, 'w') as md_file:
|
||||
md_file.write(f'# URLs from Sidebery Snapshots for '
|
||||
f'{today.replace(".", "-")}\n\n')
|
||||
|
||||
files_processed = 0
|
||||
for filename in sorted(os.listdir(base_dir)):
|
||||
# Debugging print removed
|
||||
if (filename.startswith(f'snapshot-{today}-')
|
||||
and filename.endswith('.json')):
|
||||
files_processed += 1
|
||||
print(f"Processing file: "
|
||||
f"{os.path.join(base_dir, filename)}")
|
||||
|
||||
# Extract and format date and time from filename
|
||||
# Example: snapshot-2026.01.25-13.19.29.json
|
||||
clean_filename = (filename.replace('snapshot-', '')
|
||||
.replace('.json', ''))
|
||||
date_time_parts = clean_filename.split('-', 1)
|
||||
|
||||
formatted_date = date_time_parts[0].replace('.', '-')
|
||||
formatted_time = date_time_parts[1].replace('.', ':')
|
||||
|
||||
datetime_str = f"{formatted_date} {formatted_time}"
|
||||
|
||||
md_file.write(f'## {datetime_str}\n\n')
|
||||
|
||||
with open(os.path.join(base_dir, filename), 'r') as json_file:
|
||||
try:
|
||||
data = json.load(json_file)
|
||||
urls = find_urls(data)
|
||||
print(f" Found {len(urls)} URLs")
|
||||
for url in urls:
|
||||
if url not in url_titles:
|
||||
try:
|
||||
# Get title of URL
|
||||
res = requests.get(
|
||||
url,
|
||||
timeout=10,
|
||||
allow_redirects=True
|
||||
)
|
||||
soup = BeautifulSoup(
|
||||
res.text,
|
||||
'html.parser'
|
||||
)
|
||||
if soup.title and soup.title.string:
|
||||
title = soup.title.string.strip()
|
||||
else:
|
||||
domain = urlparse(url).netloc
|
||||
title = domain if domain else url
|
||||
url_titles[url] = title
|
||||
except requests.exceptions.InvalidSchema:
|
||||
continue
|
||||
except Exception:
|
||||
domain = urlparse(url).netloc
|
||||
title = domain if domain else url
|
||||
url_titles[url] = title
|
||||
if url in url_titles:
|
||||
title = url_titles[url]
|
||||
md_file.write(f'- [{title}]({url})\n')
|
||||
md_file.write('\n')
|
||||
except json.JSONDecodeError:
|
||||
print(f" Error decoding JSON in {filename}")
|
||||
md_file.write('- Error decoding JSON\n\n')
|
||||
|
||||
if files_processed == 0:
|
||||
print("No files found for today.")
|
||||
|
||||
print(f"Processing complete. Output written to {output_filepath}")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -22,6 +22,7 @@ in
|
||||
homebrew.enable = lib.mkDefault true;
|
||||
};
|
||||
services = {
|
||||
daily-summary.enable = lib.mkDefault true;
|
||||
dock.enable = lib.mkDefault true;
|
||||
finder.enable = lib.mkDefault true;
|
||||
hammerspoon.enable = lib.mkDefault true;
|
||||
|
||||
@@ -125,7 +125,7 @@ in
|
||||
services.cloudflare-dyndns.domains = [ hostnames.budget ];
|
||||
|
||||
# Backups
|
||||
services.restic.backups.default.paths = [ "/var/lib/actual" ];
|
||||
services.restic.backups.default.paths = [ "/var/lib/private/actual" ];
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@ in
|
||||
{
|
||||
handler = "static_response";
|
||||
status_code = "403";
|
||||
body = "IP not allowed";
|
||||
}
|
||||
];
|
||||
}
|
||||
@@ -109,96 +110,95 @@ in
|
||||
apps.tls.automation.policies = cfg.tlsPolicies;
|
||||
|
||||
# Setup logging to journal and files
|
||||
logging.logs =
|
||||
{
|
||||
# System logs and catch-all
|
||||
# Must be called `default` to override Caddy's built-in default logger
|
||||
default = {
|
||||
level = "INFO";
|
||||
encoder.format = "console";
|
||||
writer = {
|
||||
output = "stderr";
|
||||
};
|
||||
exclude = (map (hostname: "http.log.access.${hostname}") (builtins.attrNames hostname_map)) ++ [
|
||||
"http.log.access.${default_logger_name}"
|
||||
];
|
||||
logging.logs = {
|
||||
# System logs and catch-all
|
||||
# Must be called `default` to override Caddy's built-in default logger
|
||||
default = {
|
||||
level = "INFO";
|
||||
encoder.format = "console";
|
||||
writer = {
|
||||
output = "stderr";
|
||||
};
|
||||
# This is for the default access logs (anything not captured by hostname)
|
||||
other = {
|
||||
level = "INFO";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/other.log";
|
||||
roll = true;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
include = [ "http.log.access.${default_logger_name}" ];
|
||||
};
|
||||
# This is for using the Caddy API, which will probably never happen
|
||||
admin = {
|
||||
level = "INFO";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/admin.log";
|
||||
roll = true;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
include = [ "admin" ];
|
||||
};
|
||||
# This is for TLS cert management tracking
|
||||
tls = {
|
||||
level = "INFO";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/tls.log";
|
||||
roll = true;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
include = [ "tls" ];
|
||||
};
|
||||
# This is for debugging
|
||||
debug = {
|
||||
level = "DEBUG";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/debug.log";
|
||||
roll = true;
|
||||
roll_keep = 1;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
};
|
||||
}
|
||||
# These are the access logs for individual hostnames
|
||||
// (lib.mapAttrs (name: value: {
|
||||
exclude = (map (hostname: "http.log.access.${hostname}") (builtins.attrNames hostname_map)) ++ [
|
||||
"http.log.access.${default_logger_name}"
|
||||
];
|
||||
};
|
||||
# This is for the default access logs (anything not captured by hostname)
|
||||
other = {
|
||||
level = "INFO";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/${name}-access.log";
|
||||
filename = "${config.services.caddy.logDir}/other.log";
|
||||
roll = true;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
include = [ "http.log.access.${default_logger_name}" ];
|
||||
};
|
||||
# This is for using the Caddy API, which will probably never happen
|
||||
admin = {
|
||||
level = "INFO";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/admin.log";
|
||||
roll = true;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
include = [ "admin" ];
|
||||
};
|
||||
# This is for TLS cert management tracking
|
||||
tls = {
|
||||
level = "INFO";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/tls.log";
|
||||
roll = true;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
include = [ "tls" ];
|
||||
};
|
||||
# This is for debugging
|
||||
debug = {
|
||||
level = "DEBUG";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/debug.log";
|
||||
roll = true;
|
||||
roll_keep = 1;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
};
|
||||
}
|
||||
# These are the access logs for individual hostnames
|
||||
// (lib.mapAttrs (name: value: {
|
||||
level = "INFO";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/${name}-access.log";
|
||||
roll = true;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
include = [ "http.log.access.${name}" ];
|
||||
}) hostname_map)
|
||||
# We also capture just the errors separately for easy debugging
|
||||
// (lib.mapAttrs' (name: value: {
|
||||
name = "${name}-error";
|
||||
value = {
|
||||
level = "ERROR";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/${name}-error.log";
|
||||
roll = true;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
include = [ "http.log.access.${name}" ];
|
||||
}) hostname_map)
|
||||
# We also capture just the errors separately for easy debugging
|
||||
// (lib.mapAttrs' (name: value: {
|
||||
name = "${name}-error";
|
||||
value = {
|
||||
level = "ERROR";
|
||||
encoder.format = "json";
|
||||
writer = {
|
||||
output = "file";
|
||||
filename = "${config.services.caddy.logDir}/${name}-error.log";
|
||||
roll = true;
|
||||
inherit roll_size_mb;
|
||||
};
|
||||
include = [ "http.log.access.${name}" ];
|
||||
};
|
||||
}) hostname_map);
|
||||
};
|
||||
}) hostname_map);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -173,5 +173,16 @@ in
|
||||
# Enable the home-made service that we created for non-proxied records
|
||||
services.cloudflare-dyndns-noproxy.enable = true;
|
||||
|
||||
# Create certs when not using proxy
|
||||
secrets.cloudflare-dns-api-prefixed = {
|
||||
source = ./cloudflare-api.age;
|
||||
dest = "${config.secretsDirectory}/cloudflare-dns-api-prefixed";
|
||||
prefix = "CLOUDFLARE_DNS_API_TOKEN=";
|
||||
};
|
||||
security.acme = {
|
||||
acceptTerms = true;
|
||||
defaults.email = "acme@${config.nmasur.presets.programs.msmtp.domain}";
|
||||
};
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
41
platforms/nixos/modules/nmasur/presets/services/murmur.nix
Normal file
41
platforms/nixos/modules/nmasur/presets/services/murmur.nix
Normal file
@@ -0,0 +1,41 @@
|
||||
# murmur is a Mumble server for hosting voice chat
|
||||
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
inherit (config.nmasur.settings) hostnames;
|
||||
cfg = config.nmasur.presets.services.murmur;
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
options.nmasur.presets.services.murmur.enable =
|
||||
lib.mkEnableOption "murmur (mumble) voice chat service";
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
|
||||
services.murmur = {
|
||||
enable = true;
|
||||
users = 50; # Max concurrent users
|
||||
bonjour = false; # Auto-connect LAN
|
||||
registerUrl = "https://${hostnames.mumble}";
|
||||
registerName = "Mumble";
|
||||
environmentFile = null;
|
||||
sslKey = "${config.security.acme.certs."${hostnames.mumble}".directory}/key.pem";
|
||||
sslCert = "${config.security.acme.certs."${hostnames.mumble}".directory}/fullchain.pem";
|
||||
openFirewall = true;
|
||||
};
|
||||
|
||||
# Configure Cloudflare DNS to point to this machine
|
||||
nmasur.presets.services.cloudflare.noProxyDomains = [ hostnames.mumble ];
|
||||
|
||||
security.acme.certs."${hostnames.mumble}" = {
|
||||
dnsProvider = "cloudflare";
|
||||
credentialsFile = config.secrets.cloudflare-dns-api-prefixed.dest;
|
||||
group = config.services.murmur.group;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -21,6 +21,7 @@ in
|
||||
N8N_LISTEN_ADDRESS = "127.0.0.1";
|
||||
N8N_PORT = 5678;
|
||||
N8N_EDITOR_BASE_URL = "https://${hostnames.n8n}";
|
||||
N8N_RESTRICT_FILE_ACCESS_TO = "/var/lib/n8n";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -35,7 +36,7 @@ in
|
||||
{
|
||||
handler = "reverse_proxy";
|
||||
upstreams = [
|
||||
{ dial = "localhost:${builtins.toString config.services.n8n.environment.N8N_PORT}"; }
|
||||
{ dial = "localhost:${toString config.services.n8n.environment.N8N_PORT}"; }
|
||||
];
|
||||
}
|
||||
];
|
||||
|
||||
@@ -32,6 +32,7 @@ in
|
||||
mathesar.enable = lib.mkDefault true;
|
||||
mealie.enable = lib.mkDefault true;
|
||||
minecraft-server.enable = lib.mkDefault false;
|
||||
murmur.enable = lib.mkDefault true;
|
||||
n8n.enable = lib.mkDefault true;
|
||||
nix-autoupgrade.enable = lib.mkDefault true; # On by default for communications
|
||||
ntfy-sh.enable = lib.mkDefault true;
|
||||
|
||||
@@ -44,7 +44,7 @@ in
|
||||
enable = lib.mkDefault (!config.networking.networkmanager.enable);
|
||||
|
||||
# Allows the user to control the WiFi settings.
|
||||
userControlled.enable = lib.mkDefault true;
|
||||
userControlled = lib.mkDefault true;
|
||||
};
|
||||
|
||||
# Wake up tempest with a command
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
in
|
||||
{
|
||||
default = pkgs.mkShell { buildInputs = with pkgs; [ nixfmt-rfc-style ]; };
|
||||
default = pkgs.mkShell { buildInputs = with pkgs; [ nixfmt ]; };
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user