27 Commits

Author SHA1 Message Date
Noah Masur
a7dacb7edf murmur (mumble server) and non-caddy acme client 2026-02-14 20:11:52 +00:00
github-actions[bot]
dfd3b955c0 flake.lock: Update
Flake lock file updates:

• Updated input 'darwin':
    'github:lnl7/nix-darwin/0d7874ef7e3ba02d58bebb871e6e29da36fa1b37' (2026-02-04)
  → 'github:lnl7/nix-darwin/6c5a56295d2a24e43bcd8af838def1b9a95746b2' (2026-02-12)
• Updated input 'home-manager':
    'github:nix-community/home-manager/471e6a065f9efed51488d7c51a9abbd387df91b8' (2026-02-05)
  → 'github:nix-community/home-manager/05e6dc0f6ed936f918cb6f0f21f1dad1e4c53150' (2026-02-14)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/00c21e4c93d963c50d4c0c89bfa84ed6e0694df2' (2026-02-04)
  → 'github:nixos/nixpkgs/ec7c70d12ce2fc37cb92aff673dcdca89d187bae' (2026-02-11)
• Updated input 'nur':
    'github:nix-community/nur/227b931ac44365853d7a0026360878cb990b426e' (2026-02-07)
  → 'github:nix-community/nur/40fb292376611e388cb14329c96853966f57763a' (2026-02-14)
• Updated input 'rust-overlay':
    'github:oxalica/rust-overlay/9922ff9f99a6436756cbe6f5d11f9c3630e58cf0' (2026-02-07)
  → 'github:oxalica/rust-overlay/d7a86c8a4df49002446737603a3e0d7ef91a9637' (2026-02-14)
• Updated input 'wsl':
    'github:nix-community/NixOS-WSL/38a5250e57f583662eac3b944830e4b9e169e965' (2026-01-24)
  → 'github:nix-community/NixOS-WSL/5b50ea1aaa14945d4794c80fcc99c4aa1db84d2d' (2026-02-09)
2026-02-14 05:01:07 +00:00
Noah Masur
fd7ddf71f3 update to fix builds on macos 2026-02-10 17:20:00 -05:00
github-actions[bot]
bba66e3e6a flake.lock: Update
Flake lock file updates:

• Updated input 'darwin':
    'github:lnl7/nix-darwin/0fc4e7ac670a0ed874abacf73c4b072a6a58064b' (2026-01-18)
  → 'github:lnl7/nix-darwin/0d7874ef7e3ba02d58bebb871e6e29da36fa1b37' (2026-02-04)
• Updated input 'home-manager':
    'github:nix-community/home-manager/475921375def3eb930e1f8883f619ff8609accb6' (2026-01-30)
  → 'github:nix-community/home-manager/471e6a065f9efed51488d7c51a9abbd387df91b8' (2026-02-05)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/bfc1b8a4574108ceef22f02bafcf6611380c100d' (2026-01-26)
  → 'github:nixos/nixpkgs/00c21e4c93d963c50d4c0c89bfa84ed6e0694df2' (2026-02-04)
• Updated input 'nur':
    'github:nix-community/nur/2db81de33100ef4d86ebc80dc4bc30df1fe97c5d' (2026-01-31)
  → 'github:nix-community/nur/227b931ac44365853d7a0026360878cb990b426e' (2026-02-07)
• Updated input 'rust-overlay':
    'github:oxalica/rust-overlay/a1d32c90c8a4ea43e9586b7e5894c179d5747425' (2026-01-31)
  → 'github:oxalica/rust-overlay/9922ff9f99a6436756cbe6f5d11f9c3630e58cf0' (2026-02-07)
2026-02-07 04:56:30 +00:00
Noah Masur
be6d6b0d35 fix add-on manifest 2026-01-31 11:53:43 -05:00
Noah Masur
0239a9925c try to prevent unnecessary firefox rebuidl 2026-01-31 11:53:43 -05:00
Noah Masur
49e35403b6 adjust daily summary to use browser extension for history 2026-01-31 11:53:43 -05:00
Noah Masur
430b522c61 enable daily browser summary on darwin 2026-01-31 11:53:43 -05:00
Noah Masur
a64488093c fix current build on darwin 2026-01-31 11:53:43 -05:00
Noah Masur
54d2376437 add alabaster theme to helix 2026-01-31 11:53:43 -05:00
Noah Masur
cd0a5d5de0 fix vertical pane navigation in zellij 2026-01-31 11:53:30 -05:00
github-actions[bot]
10eecfa136 flake.lock: Update
Flake lock file updates:

• Updated input 'disko':
    'github:nix-community/disko/00395d188e3594a1507f214a2f15d4ce5c07cb28' (2026-01-20)
  → 'github:nix-community/disko/71a3fc97d80881e91710fe721f1158d3b96ae14d' (2026-01-27)
• Updated input 'home-manager':
    'github:nix-community/home-manager/082a4cd87c6089d1d9c58ebe52655f9e07245fcb' (2026-01-23)
  → 'github:nix-community/home-manager/475921375def3eb930e1f8883f619ff8609accb6' (2026-01-30)
• Updated input 'nixos-generators':
    'github:nix-community/nixos-generators/032a1878682fafe829edfcf5fdfad635a2efe748' (2025-11-27)
  → 'github:nix-community/nixos-generators/8946737ff703382fda7623b9fab071d037e897d5' (2026-01-30)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/88d3861acdd3d2f0e361767018218e51810df8a1' (2026-01-21)
  → 'github:nixos/nixpkgs/bfc1b8a4574108ceef22f02bafcf6611380c100d' (2026-01-26)
• Updated input 'nur':
    'github:nix-community/nur/4d20ca56620171b095fc4b51d55b155395c86506' (2026-01-24)
  → 'github:nix-community/nur/2db81de33100ef4d86ebc80dc4bc30df1fe97c5d' (2026-01-31)
• Updated input 'rust-overlay':
    'github:oxalica/rust-overlay/22da29e7f3d8cff75009cbbcf992c7cb66920cfd' (2026-01-24)
  → 'github:oxalica/rust-overlay/a1d32c90c8a4ea43e9586b7e5894c179d5747425' (2026-01-31)
2026-01-31 04:53:01 +00:00
Noah Masur
b5b3f6cb6a fix: n8n can't write to disk 2026-01-25 15:00:01 +00:00
Noah Masur
810c92a7b8 update restic path for actual and fix build 2026-01-24 20:25:03 +00:00
github-actions[bot]
fcb28c8151 flake.lock: Update
Flake lock file updates:

• Updated input 'darwin':
    'github:lnl7/nix-darwin/9f48ffaca1f44b3e590976b4da8666a9e86e6eb1' (2026-01-06)
  → 'github:lnl7/nix-darwin/0fc4e7ac670a0ed874abacf73c4b072a6a58064b' (2026-01-18)
• Updated input 'disko':
    'github:nix-community/disko/916506443ecd0d0b4a0f4cf9d40a3c22ce39b378' (2025-12-19)
  → 'github:nix-community/disko/00395d188e3594a1507f214a2f15d4ce5c07cb28' (2026-01-20)
• Updated input 'home-manager':
    'github:nix-community/home-manager/d0aefc169fa9a0bd2b1239aeb98899c77d6da5b2' (2026-01-10)
  → 'github:nix-community/home-manager/082a4cd87c6089d1d9c58ebe52655f9e07245fcb' (2026-01-23)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/3497aa5c9457a9d88d71fa93a4a8368816fbeeba' (2026-01-08)
  → 'github:nixos/nixpkgs/88d3861acdd3d2f0e361767018218e51810df8a1' (2026-01-21)
• Updated input 'nur':
    'github:nix-community/nur/a4f7c05a5f80044f9dcf3dfeb55a16b5a2713caf' (2026-01-10)
  → 'github:nix-community/nur/4d20ca56620171b095fc4b51d55b155395c86506' (2026-01-24)
• Updated input 'rust-overlay':
    'github:oxalica/rust-overlay/312b4371e72f644ffcff25b23615195e3b390643' (2026-01-10)
  → 'github:oxalica/rust-overlay/22da29e7f3d8cff75009cbbcf992c7cb66920cfd' (2026-01-24)
• Updated input 'wsl':
    'github:nix-community/NixOS-WSL/be4af8042e7a61fa12fda58fe9a3b3babdefe17b' (2025-12-15)
  → 'github:nix-community/NixOS-WSL/38a5250e57f583662eac3b944830e4b9e169e965' (2026-01-24)
• Updated input 'wsl/flake-compat':
    'github:edolstra/flake-compat/65f23138d8d09a92e30f1e5c87611b23ef451bf3' (2025-12-07)
  → 'github:edolstra/flake-compat/5edf11c44bc78a0d334f6334cdaf7d60d732daab' (2025-12-29)
2026-01-24 04:16:03 +00:00
Noah Masur
e2a2d3de14 fix: playground vim plugin is archived 2026-01-17 10:40:01 -05:00
Noah Masur
adbc2bd261 enable thunderbird for tasks, calendar, and email gui 2026-01-11 19:45:39 -06:00
Noah Masur
117fd8a06e replace nixfmt-rfc-style with equivalent nixfmt 2026-01-11 16:38:47 -05:00
Noah Masur
d9fbdf7bfe Update flake, fix userControlled attribute
Also add nix-inspect
2026-01-10 14:21:43 -05:00
github-actions[bot]
2d13780d2e flake.lock: Update
Flake lock file updates:

• Updated input 'darwin':
    'github:lnl7/nix-darwin/5fb45ece6129bd7ad8f7310df0ae9c00bae7c562' (2025-12-18)
  → 'github:lnl7/nix-darwin/c31afa6e76da9bbc7c9295e39c7de9fca1071ea1' (2025-12-29)
• Updated input 'home-manager':
    'github:nix-community/home-manager/bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5' (2025-12-19)
  → 'github:nix-community/home-manager/2f06b726061b7e1aa69f718e943da9ffcecd6397' (2026-01-02)
• Updated input 'mac-app-util':
    'github:hraban/mac-app-util/8414fa1e2cb775b17793104a9095aabeeada63ef' (2025-08-24)
  → 'github:hraban/mac-app-util/4747968574ea58512c5385466400b2364c85d2d0' (2025-12-27)
• Updated input 'mac-app-util/cl-nix-lite':
    'github:hraban/cl-nix-lite/31cfe6275c341eb3120a99f4b1c8516c49a29d87' (2024-10-06)
  → 'github:hraban/cl-nix-lite/038e341cede255a83a8f04af114dc95717461d32' (2025-12-27)
• Added input 'mac-app-util/cl-nix-lite/flake-parts':
    'github:hercules-ci/flake-parts/a34fae9c08a15ad73f295041fec82323541400a9' (2025-12-15)
• Added input 'mac-app-util/cl-nix-lite/flake-parts/nixpkgs-lib':
    'github:nix-community/nixpkgs.lib/2075416fcb47225d9b68ac469a5c4801a9c4dd85' (2025-12-14)
• Added input 'mac-app-util/cl-nix-lite/nixpkgs':
    'github:nixos/nixpkgs/f560ccec6b1116b22e6ed15f4c510997d99d5852' (2025-12-26)
• Added input 'mac-app-util/cl-nix-lite/systems':
    'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09)
• Added input 'mac-app-util/cl-nix-lite/treefmt-nix':
    'github:numtide/treefmt-nix/42d96e75aa56a3f70cab7e7dc4a32868db28e8fd' (2025-12-17)
• Added input 'mac-app-util/cl-nix-lite/treefmt-nix/nixpkgs':
    'github:nixos/nixpkgs/d5faa84122bc0a1fd5d378492efce4e289f8eac1' (2025-10-23)
• Updated input 'mac-app-util/treefmt-nix':
    'github:numtide/treefmt-nix/74e1a52d5bd9430312f8d1b8b0354c92c17453e5' (2025-08-23)
  → 'github:numtide/treefmt-nix/42d96e75aa56a3f70cab7e7dc4a32868db28e8fd' (2025-12-17)
• Updated input 'mac-app-util/treefmt-nix/nixpkgs':
    'github:nixos/nixpkgs/cab778239e705082fe97bb4990e0d24c50924c04' (2025-08-04)
  → 'github:nixos/nixpkgs/d5faa84122bc0a1fd5d378492efce4e289f8eac1' (2025-10-23)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/c6245e83d836d0433170a16eb185cefe0572f8b8' (2025-12-18)
  → 'github:nixos/nixpkgs/cad22e7d996aea55ecab064e84834289143e44a0' (2025-12-30)
• Updated input 'nixpkgs-stable':
    'github:nixos/nixpkgs/2b0d2b456e4e8452cf1c16d00118d145f31160f9' (2025-12-17)
  → 'github:nixos/nixpkgs/40ee5e1944bebdd128f9fbada44faefddfde29bd' (2025-12-29)
• Updated input 'nur':
    'github:nix-community/nur/e036ffaac9c2869ab23d4fb1c0d9da50fe2f852a' (2025-12-20)
  → 'github:nix-community/nur/846861904f43cd2bb04314f664514c87e26c512b' (2026-01-03)
• Updated input 'rust-overlay':
    'github:oxalica/rust-overlay/66bb33fdfb50b1ee724381c3f5d6012dac6c89b3' (2025-12-20)
  → 'github:oxalica/rust-overlay/294198315a13d6d130565ad08e97685df7b0d458' (2026-01-03)
2026-01-03 04:12:23 +00:00
Noah Masur
53a712a217 update caddy hash 2026-01-01 18:16:43 +00:00
Noah Masur
31d34c6540 fixes to get nix flake check working with new updates 2025-12-30 16:33:23 -05:00
Noah Masur
a978e67346 comment out spctl allow apps from anywhere
doesn't work when using nh because it requires a UI escalation when
run via indirectly
2025-12-26 10:31:31 -07:00
Noah Masur
a6915a6d2d try to fix nix-darwin breaking starship prompt on rebuild 2025-12-26 10:31:12 -07:00
Noah Masur
44c4034236 more fixes on warning for renamed system 2025-12-26 10:29:18 -07:00
Noah Masur
a99c14a8c2 use stable zed-editor to stop uncached builds 2025-12-26 10:28:31 -07:00
Noah Masur
f1c8e26044 comment out 1password extension while it doesn't work in firefox 2025-12-26 10:27:55 -07:00
40 changed files with 1026 additions and 189 deletions

258
flake.lock generated
View File

@@ -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,

View File

@@ -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
View File

@@ -0,0 +1,5 @@
inputs: final: prev: {
firefox-unwrapped = final.stable.firefox-unwrapped;
}

View File

@@ -4,7 +4,8 @@
inputs: _final: prev: {
# Provides `pkgs.stable`.
stable = import inputs.nixpkgs-stable {
inherit (prev) system config;
system = prev.stdenv.hostPlatform.system;
config = { };
overlays = [
# inputs.self.overlays.vim-plugins
];

View File

@@ -4,7 +4,8 @@
inputs: _final: prev: {
# Provides `pkgs.unstable`.
unstable = import inputs.nixpkgs {
inherit (prev) system config;
system = prev.stdenv.hostPlatform.system;
inherit (prev) config;
overlays = [
# inputs.self.overlays.vim-plugins
];

View File

@@ -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";

View File

@@ -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

View File

@@ -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=";
}

View 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();
}
});

View 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"]
}
}
}
}

View 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;
};
}

View 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>

View 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);
});

View File

@@ -5,7 +5,7 @@ pkgs.mkShell {
buildInputs = with pkgs; [
git
stylua
nixfmt-rfc-style
nixfmt
shfmt
shellcheck
];

View File

@@ -18,16 +18,17 @@ in
"1password"
"_1password-gui"
"1password-cli"
"onepassword-password-manager" # Firefox extension
# "onepassword-password-manager" # Firefox extension
];
home.packages = [
pkgs._1password-cli
] ++ (if pkgs.stdenv.isLinux then [ pkgs._1password-gui ] else [ ]);
]
++ (if pkgs.stdenv.isLinux then [ pkgs._1password-gui ] else [ ]);
# Firefox extension
programs.firefox.profiles.default.extensions.packages = [
pkgs.nur.repos.rycee.firefox-addons.onepassword-password-manager
];
# # Firefox extension
# programs.firefox.profiles.default.extensions.packages = [
# pkgs.nur.repos.rycee.firefox-addons.onepassword-password-manager
# ];
};
# # https://1password.community/discussion/135462/firefox-extension-does-not-connect-to-linux-app

View File

@@ -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;

View File

@@ -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

View File

@@ -22,7 +22,6 @@ in
extensions = [
pkgs.nmasur.gh-collaborators
pkgs.gh-dash
pkgs.gh-copilot
];
};

View File

@@ -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

View File

@@ -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-----

View 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" ];
# };
# };
};
}

View File

@@ -16,6 +16,7 @@ in
config = lib.mkIf cfg.enable {
programs.zed-editor = {
enable = true;
package = pkgs.stable.zed-editor;
extensions = [
"nix"

View File

@@ -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" ];
};
};
};
};

View File

@@ -26,7 +26,7 @@ in
obsidian = "${pkgs.obsidian}/Applications/Obsidian.app";
slack = "${pkgs.slack}/Applications/Slack.app";
wezterm = "${pkgs.wezterm}/Applications/WezTerm.app";
zed = "${pkgs.zed-editor}/Applications/Zed.app";
zed = "${config.programs.zed-editor.package}/Applications/Zed.app";
};
xdg.configFile."hammerspoon/Spoons/MoveWindow.spoon".source = ./Spoons/MoveWindow.spoon;

View File

@@ -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

View File

@@ -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;
};

View File

@@ -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

View File

@@ -23,5 +23,19 @@ in
# Speeds up fish launch time on macOS
programs.fish.useBabelfish = true;
programs.fish.shellInit = ''
set -g __nixos_path_original $PATH
function __nixos_path_fix -d "fix PATH value"
set -l result (string split ":" $__nixos_path_original)
for elt in $PATH
if not contains -- $elt $result
set -a result $elt
end
end
set -g PATH $result
end
__nixos_path_fix
'';
};
}

View File

@@ -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;
}
];
};
};
};
}

View File

@@ -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()

View File

@@ -96,14 +96,14 @@ in
};
};
# Settings that don't have an option in nix-darwin
activationScripts.postActivation.text = ''
echo "Allow apps from anywhere"
SPCTL=$(spctl --status)
if ! [ "$SPCTL" = "assessments disabled" ]; then
sudo spctl --master-disable
fi
'';
# # Settings that don't have an option in nix-darwin
# activationScripts.postActivation.text = ''
# echo "Allow apps from anywhere"
# SPCTL=$(spctl --status)
# if ! [ "$SPCTL" = "assessments disabled" ]; then
# spctl --master-disable
# fi
# '';
};

View File

@@ -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;

View File

@@ -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" ];
};

View File

@@ -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);
}
);
};

View File

@@ -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}";
};
};
}

View 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;
};
};
}

View File

@@ -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}"; }
];
}
];

View File

@@ -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;

View File

@@ -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

View File

@@ -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 ]; };
}
);
};