1 Commits

Author SHA1 Message Date
github-actions[bot]
3ddd460490 flake.lock: Update
Flake lock file updates:

• Updated input 'darwin':
    'github:lnl7/nix-darwin/8df64f819698c1fee0c2969696f54a843b2231e8' (2025-08-22)
  → 'github:lnl7/nix-darwin/ebd0bfc11fc2b5cff37401e9b3703881ad5fabbd' (2025-09-17)
• Updated input 'disko':
    'github:nix-community/disko/bafad29f89e83b2d861b493aa23034ea16595560' (2025-08-25)
  → 'github:nix-community/disko/67ff9807dd148e704baadbd4fd783b54282ca627' (2025-09-19)
• Updated input 'helix':
    'github:helix-editor/helix/77ff51caa440b1066e0a1920007ab5e148dd4856' (2025-08-29)
  → 'github:helix-editor/helix/0ae37dc52ba715100893c327414bcb1a1924a4c3' (2025-09-18)
• Updated input 'home-manager':
    'github:nix-community/home-manager/77a71380c38fb2a440b4b5881bbc839f6230e1cb' (2025-08-29)
  → 'github:nix-community/home-manager/55b1f5b7b191572257545413b98e37abab2fdb00' (2025-09-19)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/dfb2f12e899db4876308eba6d93455ab7da304cd' (2025-08-28)
  → 'github:nixos/nixpkgs/0147c2f1d54b30b5dd6d4a8c8542e8d7edf93b5d' (2025-09-18)
• Updated input 'nur':
    'github:nix-community/nur/e82a8b0095f54edb6bbbb1d862f3da502dca1396' (2025-08-30)
  → 'github:nix-community/nur/957eddcb40c8c7dd4120f808786ea4d8b77a7feb' (2025-09-20)
• Updated input 'wsl':
    'github:nix-community/NixOS-WSL/203a7b463f307c60026136dd1191d9001c43457f' (2025-08-15)
  → 'github:nix-community/NixOS-WSL/ba2b3b6c0bc42442559a3b090f032bc8d501f5e3' (2025-09-17)
2025-09-20 03:46:37 +00:00
66 changed files with 365 additions and 1431 deletions

320
flake.lock generated
View File

@@ -1,18 +1,12 @@
{ {
"nodes": { "nodes": {
"cl-nix-lite": { "cl-nix-lite": {
"inputs": {
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs",
"systems": "systems",
"treefmt-nix": "treefmt-nix"
},
"locked": { "locked": {
"lastModified": 1766810506, "lastModified": 1728174978,
"narHash": "sha256-I4BxozsEu205tA7jazufztI8ZQ5p7hcCnjqrSKPz9nI=", "narHash": "sha256-Grqqg+xuicANB85j0gNEXxi9SBKY7bzGeTuyi95eGcY=",
"owner": "hraban", "owner": "hraban",
"repo": "cl-nix-lite", "repo": "cl-nix-lite",
"rev": "038e341cede255a83a8f04af114dc95717461d32", "rev": "31cfe6275c341eb3120a99f4b1c8516c49a29d87",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -28,11 +22,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1770922915, "lastModified": 1758102940,
"narHash": "sha256-6J/JoK9iL7sHvKJcGW2KId2agaKv1OGypsa7kN+ZBD4=", "narHash": "sha256-wwqf3+A8EiqwWpcAaPN20QXJLlpGPpwtLTrzgnngI2o=",
"owner": "lnl7", "owner": "lnl7",
"repo": "nix-darwin", "repo": "nix-darwin",
"rev": "6c5a56295d2a24e43bcd8af838def1b9a95746b2", "rev": "ebd0bfc11fc2b5cff37401e9b3703881ad5fabbd",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -49,11 +43,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1769524058, "lastModified": 1758287904,
"narHash": "sha256-zygdD6X1PcVNR2PsyK4ptzrVEiAdbMqLos7utrMDEWE=", "narHash": "sha256-IGmaEf3Do8o5Cwp1kXBN1wQmZwQN3NLfq5t4nHtVtcU=",
"owner": "nix-community", "owner": "nix-community",
"repo": "disko", "repo": "disko",
"rev": "71a3fc97d80881e91710fe721f1158d3b96ae14d", "rev": "67ff9807dd148e704baadbd4fd783b54282ca627",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -82,11 +76,11 @@
"flake-compat_2": { "flake-compat_2": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1767039857, "lastModified": 1747046372,
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
"owner": "edolstra", "owner": "edolstra",
"repo": "flake-compat", "repo": "flake-compat",
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -96,24 +90,6 @@
} }
}, },
"flake-parts": { "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": { "inputs": {
"nixpkgs-lib": [ "nixpkgs-lib": [
"nur", "nur",
@@ -156,7 +132,7 @@
}, },
"flake-utils_2": { "flake-utils_2": {
"inputs": { "inputs": {
"systems": "systems_3" "systems": "systems_2"
}, },
"locked": { "locked": {
"lastModified": 1731533236, "lastModified": 1731533236,
@@ -172,6 +148,27 @@
"type": "github" "type": "github"
} }
}, },
"helix": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1758204752,
"narHash": "sha256-tgblfdzdM3XAzYHHvA9GX9SR2P8NG2IzewmfnRmTUxg=",
"owner": "helix-editor",
"repo": "helix",
"rev": "0ae37dc52ba715100893c327414bcb1a1924a4c3",
"type": "github"
},
"original": {
"owner": "helix-editor",
"repo": "helix",
"type": "github"
}
},
"home-manager": { "home-manager": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -179,11 +176,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1771037579, "lastModified": 1758296614,
"narHash": "sha256-NX5XuhGcsmk0oEII2PEtMRgvh2KaAv3/WWQsOpxAgR4=", "narHash": "sha256-l60D1i0aaSqemy9dL7wP0ePMfcv/oZbeKpvUMY+q0kQ=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "05e6dc0f6ed936f918cb6f0f21f1dad1e4c53150", "rev": "55b1f5b7b191572257545413b98e37abab2fdb00",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -198,16 +195,18 @@
"cl-nix-lite": "cl-nix-lite", "cl-nix-lite": "cl-nix-lite",
"flake-compat": "flake-compat", "flake-compat": "flake-compat",
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"nixpkgs": "nixpkgs_3", "nixpkgs": [
"systems": "systems_2", "nixpkgs"
"treefmt-nix": "treefmt-nix_2" ],
"systems": "systems",
"treefmt-nix": "treefmt-nix"
}, },
"locked": { "locked": {
"lastModified": 1766810876, "lastModified": 1756057867,
"narHash": "sha256-VPElWFQIiP31lXQXEom+L4sl85alZpZn33O4hewsP9k=", "narHash": "sha256-ziR5eQGqRWhW8tf8r0TIplaqNt+HXu1G1X41LUr4IYo=",
"owner": "hraban", "owner": "hraban",
"repo": "mac-app-util", "repo": "mac-app-util",
"rev": "4747968574ea58512c5385466400b2364c85d2d0", "rev": "8414fa1e2cb775b17793104a9095aabeeada63ef",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -260,11 +259,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1769813415, "lastModified": 1751903740,
"narHash": "sha256-nnVmNNKBi1YiBNPhKclNYDORoHkuKipoz7EtVnXO50A=", "narHash": "sha256-PeSkNMvkpEvts+9DjFiop1iT2JuBpyknmBUs0Un0a4I=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixos-generators", "repo": "nixos-generators",
"rev": "8946737ff703382fda7623b9fab071d037e897d5", "rev": "032decf9db65efed428afd2fa39d80f7089085eb",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -275,106 +274,43 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1766736597, "lastModified": 1754340878,
"narHash": "sha256-BASnpCLodmgiVn0M1MU2Pqyoz0aHwar/0qLkp7CjvSQ=", "narHash": "sha256-lgmUyVQL9tSnvvIvBp7x1euhkkCho7n3TMzgjdvgPoU=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "f560ccec6b1116b22e6ed15f4c510997d99d5852", "rev": "cab778239e705082fe97bb4990e0d24c50924c04",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-25.11", "ref": "nixpkgs-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "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": { "nixpkgs-stable": {
"locked": { "locked": {
"lastModified": 1767313136, "lastModified": 1735563628,
"narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", "narHash": "sha256-OnSAY7XDSx7CtDoqNh8jwVwh4xNL/2HaJxGjryLWzX8=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", "rev": "b134951a4c9f3c995fd7be05f3243f8ecd65d798",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-25.05", "ref": "nixos-24.05",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1761236834, "lastModified": 1758198701,
"narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=", "narHash": "sha256-7To75JlpekfUmdkUZewnT6MoBANS0XVypW6kjUOXQwc=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1", "rev": "0147c2f1d54b30b5dd6d4a8c8542e8d7edf93b5d",
"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" "type": "github"
}, },
"original": { "original": {
@@ -384,13 +320,13 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs_6": { "nixpkgs_3": {
"locked": { "locked": {
"lastModified": 1744536153, "lastModified": 1728538411,
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", "narHash": "sha256-f0SBJz1eZ2yOuKUr5CA9BHULGXVSn6miBuUWdTyhUhU=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", "rev": "b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -402,17 +338,17 @@
}, },
"nur": { "nur": {
"inputs": { "inputs": {
"flake-parts": "flake-parts_2", "flake-parts": "flake-parts",
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
] ]
}, },
"locked": { "locked": {
"lastModified": 1771044752, "lastModified": 1758339501,
"narHash": "sha256-9pnZltSDksIepwd1PJIskZKXTGQzdElS/zK/qnlj2uU=", "narHash": "sha256-ot58+ry2wvGMYck0b80dB9G5CxdAcrYR54SUNn+/Kmg=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nur", "repo": "nur",
"rev": "40fb292376611e388cb14329c96853966f57763a", "rev": "957eddcb40c8c7dd4120f808786ea4d8b77a7feb",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -425,14 +361,14 @@
"inputs": { "inputs": {
"darwin": "darwin", "darwin": "darwin",
"disko": "disko", "disko": "disko",
"helix": "helix",
"home-manager": "home-manager", "home-manager": "home-manager",
"mac-app-util": "mac-app-util", "mac-app-util": "mac-app-util",
"nix2vim": "nix2vim", "nix2vim": "nix2vim",
"nixos-generators": "nixos-generators", "nixos-generators": "nixos-generators",
"nixpkgs": "nixpkgs_5", "nixpkgs": "nixpkgs_2",
"nixpkgs-stable": "nixpkgs-stable", "nixpkgs-stable": "nixpkgs-stable",
"nur": "nur", "nur": "nur",
"rust-overlay": "rust-overlay",
"wsl": "wsl", "wsl": "wsl",
"zellij-switch": "zellij-switch", "zellij-switch": "zellij-switch",
"zenyd-mpv-scripts": "zenyd-mpv-scripts" "zenyd-mpv-scripts": "zenyd-mpv-scripts"
@@ -440,14 +376,35 @@
}, },
"rust-overlay": { "rust-overlay": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs_6" "nixpkgs": [
"helix",
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1771038269, "lastModified": 1740623427,
"narHash": "sha256-TygYZ7JhnJbRoWOk7d5HaA/GhEVCvtRruN7TqaN9s/c=", "narHash": "sha256-3SdPQrZoa4odlScFDUHd4CUPQ/R1gtH4Mq9u8CBiK8M=",
"owner": "oxalica", "owner": "oxalica",
"repo": "rust-overlay", "repo": "rust-overlay",
"rev": "d7a86c8a4df49002446737603a3e0d7ef91a9637", "rev": "d342e8b5fd88421ff982f383c853f0fc78a847ab",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"rust-overlay_2": {
"inputs": {
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1736476219,
"narHash": "sha256-+qyv3QqdZCdZ3cSO/cbpEY6tntyYjfe1bB12mdpNFaY=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "de30cc5963da22e9742bbbbb9a3344570ed237b9",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -457,21 +414,6 @@
} }
}, },
"systems": { "systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": { "locked": {
"lastModified": 1689347925, "lastModified": 1689347925,
"narHash": "sha256-ozenz5bFe1UUqOn7f60HRmgc01BgTGIKZ4Xl+HbocGQ=", "narHash": "sha256-ozenz5bFe1UUqOn7f60HRmgc01BgTGIKZ4Xl+HbocGQ=",
@@ -486,6 +428,21 @@
"type": "github" "type": "github"
} }
}, },
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_3": { "systems_3": {
"locked": { "locked": {
"lastModified": 1681028828, "lastModified": 1681028828,
@@ -501,49 +458,16 @@
"type": "github" "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": { "treefmt-nix": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs_2" "nixpkgs": "nixpkgs"
}, },
"locked": { "locked": {
"lastModified": 1766000401, "lastModified": 1755934250,
"narHash": "sha256-+cqN4PJz9y0JQXfAK5J1drd0U05D5fcAGhzhfVrDlsI=", "narHash": "sha256-CsDojnMgYsfshQw3t4zjRUkmMmUdZGthl16bXVWgRYU=",
"owner": "numtide", "owner": "numtide",
"repo": "treefmt-nix", "repo": "treefmt-nix",
"rev": "42d96e75aa56a3f70cab7e7dc4a32868db28e8fd", "rev": "74e1a52d5bd9430312f8d1b8b0354c92c17453e5",
"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" "type": "github"
}, },
"original": { "original": {
@@ -560,11 +484,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1770657009, "lastModified": 1758123407,
"narHash": "sha256-v/LA5ZSJ+JQYzMSKB4sySM0wKfsAqddNzzxLLnbsV/E=", "narHash": "sha256-4qwMlR0Q4Zr2rjUFauYIldfjzffYt3G5tZ1uPFPPYGU=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NixOS-WSL", "repo": "NixOS-WSL",
"rev": "5b50ea1aaa14945d4794c80fcc99c4aa1db84d2d", "rev": "ba2b3b6c0bc42442559a3b090f032bc8d501f5e3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -578,10 +502,8 @@
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
], ],
"rust-overlay": [ "rust-overlay": "rust-overlay_2",
"rust-overlay" "systems": "systems_3"
],
"systems": "systems_4"
}, },
"locked": { "locked": {
"lastModified": 1742588229, "lastModified": 1742588229,
@@ -600,11 +522,11 @@
"zenyd-mpv-scripts": { "zenyd-mpv-scripts": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1765050776, "lastModified": 1707704915,
"narHash": "sha256-9gO+GkNoGsxAbMRrBWu0FfXEQtyTmHivlaxlYLpV2YM=", "narHash": "sha256-9P/8q/OZXfaJMS08acQP4h3/zUA5mKRQee0JmkXcz1w=",
"owner": "zenyd", "owner": "zenyd",
"repo": "mpv-scripts", "repo": "mpv-scripts",
"rev": "62f4bb313c6cb6366672e78dea940e9da8fec84a", "rev": "9bdce0050144cb24f92475f7bdd77180e0e4c26b",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -8,7 +8,7 @@
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
# Used for specific stable packages # Used for specific stable packages
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.05"; nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.05";
# Used for MacOS system config # Used for MacOS system config
darwin = { darwin = {
@@ -37,7 +37,7 @@
# Better App install management in macOS # Better App install management in macOS
mac-app-util = { mac-app-util = {
url = "github:hraban/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 # Manage disk format and partitioning
@@ -64,23 +64,17 @@
flake = false; flake = false;
}; };
rust-overlay = {
url = "github:oxalica/rust-overlay";
};
# Zellij Switcher # Zellij Switcher
zellij-switch = { zellij-switch = {
url = "github:mostafaqanbaryan/zellij-switch"; url = "github:mostafaqanbaryan/zellij-switch";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
inputs.rust-overlay.follows = "rust-overlay";
}; };
# # Text editor # Text editor
# helix = { helix = {
# url = "github:helix-editor/helix"; url = "github:helix-editor/helix";
# inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
# inputs.rust-overlay.follows = "rust-overlay"; };
# };
# # Nextcloud Apps # # Nextcloud Apps
# nextcloud-news = { # nextcloud-news = {
@@ -132,7 +126,6 @@
mathesar = "mathesar.${baseName}"; mathesar = "mathesar.${baseName}";
metrics = "metrics.${baseName}"; metrics = "metrics.${baseName}";
minecraft = "minecraft.${baseName}"; minecraft = "minecraft.${baseName}";
mumble = "mumble.${baseName}";
n8n = "n8n.${baseName}"; n8n = "n8n.${baseName}";
navidrome = "music.${baseName}"; navidrome = "music.${baseName}";
notifications = "ntfy.${baseName}"; notifications = "ntfy.${baseName}";
@@ -140,7 +133,6 @@
photos = "photos.${baseName}"; photos = "photos.${baseName}";
postgresql = "pg.${baseName}"; postgresql = "pg.${baseName}";
prometheus = "prom.${baseName}"; prometheus = "prom.${baseName}";
recipes = "cooking.${baseName}";
secrets = "vault.${baseName}"; secrets = "vault.${baseName}";
smtp = "smtp.purelymail.com"; smtp = "smtp.purelymail.com";
status = "status.${baseName}"; status = "status.${baseName}";
@@ -255,30 +247,30 @@
default = lib.pkgsBySystem.${system}.nmasur.dotfiles-devshell; default = lib.pkgsBySystem.${system}.nmasur.dotfiles-devshell;
}); });
# checks = lib.forAllSystems ( checks = lib.forAllSystems (
# system: system:
# let let
# pkgs = import nixpkgs { pkgs = import nixpkgs {
# inherit system; inherit system;
# overlays = lib.overlays; overlays = lib.overlays;
# }; };
# in in
# { {
# neovim = neovim =
# pkgs.runCommand "neovim-check-health" { buildInputs = [ inputs.self.packages.${system}.neovim ]; } pkgs.runCommand "neovim-check-health" { buildInputs = [ inputs.self.packages.${system}.neovim ]; }
# '' ''
# mkdir -p $out mkdir -p $out
# export HOME=$TMPDIR export HOME=$TMPDIR
# nvim -c "checkhealth" -c "write $out/health.log" -c "quitall" nvim -c "checkhealth" -c "write $out/health.log" -c "quitall"
# # Check for errors inside the health log # Check for errors inside the health log
# if $(grep "ERROR" $out/health.log); then if $(grep "ERROR" $out/health.log); then
# cat $out/health.log cat $out/health.log
# exit 1 exit 1
# fi fi
# ''; '';
# } }
# ); );
formatter = lib.forAllSystems ( formatter = lib.forAllSystems (
system: system:
@@ -288,7 +280,7 @@
inherit (lib) overlays; inherit (lib) overlays;
}; };
in in
pkgs.nixfmt pkgs.nixfmt-rfc-style
); );
# Templates for starting other projects quickly # Templates for starting other projects quickly

View File

@@ -67,9 +67,8 @@ lib
inputs.nur.overlays.default inputs.nur.overlays.default
inputs.nix2vim.overlay inputs.nix2vim.overlay
inputs.zellij-switch.overlays.default inputs.zellij-switch.overlays.default
# inputs.helix.overlays.default inputs.helix.overlays.default
] ] ++ (importOverlays ../overlays);
++ (importOverlays ../overlays);
# System types to support. # System types to support.
supportedSystems = [ supportedSystems = [
@@ -98,10 +97,7 @@ lib
system: system:
import inputs.nixpkgs { import inputs.nixpkgs {
inherit system overlays; inherit system overlays;
config.permittedInsecurePackages = [ config.permittedInsecurePackages = [ "litestream-0.3.13" ];
"litestream-0.3.13"
"electron-36.9.5"
];
config.allowUnfree = true; config.allowUnfree = true;
} }
); );
@@ -134,8 +130,7 @@ lib
]; ];
extraSpecialArgs = { extraSpecialArgs = {
inherit colorscheme; inherit colorscheme;
} } // specialArgs;
// specialArgs;
}; };
buildNixos = buildNixos =
@@ -157,10 +152,8 @@ lib
home-manager = { home-manager = {
extraSpecialArgs = { extraSpecialArgs = {
inherit colorscheme; inherit colorscheme;
} } // specialArgs;
// specialArgs; } // homeModule.home-manager;
}
// homeModule.home-manager;
} }
]; ];
}; };
@@ -185,10 +178,8 @@ lib
home-manager = { home-manager = {
extraSpecialArgs = { extraSpecialArgs = {
inherit colorscheme; inherit colorscheme;
} } // specialArgs;
// specialArgs; } // homeModule.home-manager;
}
// homeModule.home-manager;
} }
]; ];
}; };
@@ -231,15 +222,12 @@ lib
home-manager = { home-manager = {
extraSpecialArgs = { extraSpecialArgs = {
inherit colorscheme; inherit colorscheme;
} } // specialArgs;
// specialArgs; } // homeModule.home-manager;
}
// homeModule.home-manager;
} }
]; ];
specialArgs = { specialArgs = {
} } // specialArgs;
// specialArgs;
}; };
} }

View File

@@ -38,7 +38,6 @@
}; };
brews = [ brews = [
"trash" # Delete files and folders to trash instead of rm "trash" # Delete files and folders to trash instead of rm
"jiratui" # Terminal program to manage Jira
]; ];
casks = [ casks = [
"1password" # 1Password will not launch from Nix on macOS "1password" # 1Password will not launch from Nix on macOS

View File

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

View File

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

View File

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

View File

@@ -100,7 +100,7 @@
lua.command = "${pkgs.stylua}/bin/stylua"; lua.command = "${pkgs.stylua}/bin/stylua";
black.command = "${pkgs.black}/bin/black"; black.command = "${pkgs.black}/bin/black";
fish_indent.command = "${pkgs.fish}/bin/fish_indent"; fish_indent.command = "${pkgs.fish}/bin/fish_indent";
nixfmt.command = "${pkgs.nixfmt}/bin/nixfmt"; nixfmt.command = "${pkgs.nixfmt-rfc-style}/bin/nixfmt";
rustfmt.command = "${pkgs.rustfmt}/bin/rustfmt"; rustfmt.command = "${pkgs.rustfmt}/bin/rustfmt";
shfmt = { shfmt = {
command = "${pkgs.shfmt}/bin/shfmt"; command = "${pkgs.shfmt}/bin/shfmt";

View File

@@ -3,10 +3,10 @@
plugins = [ plugins = [
(pkgs.vimPlugins.nvim-treesitter.withPlugins (_plugins: [ (pkgs.vimPlugins.nvim-treesitter.withPlugins (_plugins: [
pkgs.nmasur.tree-sitter-ini pkgs.nmasur.ini-grammar
pkgs.nmasur.tree-sitter-puppet pkgs.nmasur.puppet-grammar
pkgs.nmasur.tree-sitter-rasi pkgs.nmasur.rasi-grammar
pkgs.nmasur.tree-sitter-vimdoc pkgs.nmasur.vimdoc-grammar
pkgs.tree-sitter-grammars.tree-sitter-bash pkgs.tree-sitter-grammars.tree-sitter-bash
pkgs.tree-sitter-grammars.tree-sitter-c pkgs.tree-sitter-grammars.tree-sitter-c
pkgs.tree-sitter-grammars.tree-sitter-fish pkgs.tree-sitter-grammars.tree-sitter-fish
@@ -21,6 +21,7 @@
pkgs.tree-sitter-grammars.tree-sitter-yaml pkgs.tree-sitter-grammars.tree-sitter-yaml
])) ]))
pkgs.vimPlugins.vim-matchup # Better % jumping in languages pkgs.vimPlugins.vim-matchup # Better % jumping in languages
pkgs.vimPlugins.playground # Tree-sitter experimenting
pkgs.vimPlugins.nginx-vim pkgs.vimPlugins.nginx-vim
pkgs.vimPlugins.vim-helm pkgs.vimPlugins.vim-helm
# pkgs.vimPlugins.hmts-nvim # Tree-sitter injections for home-manager # pkgs.vimPlugins.hmts-nvim # Tree-sitter injections for home-manager

View File

@@ -1,22 +0,0 @@
# Caddy with Cloudflare DNS
{
pkgs,
fetchFromGitHub,
...
}:
# Maintain a static version so that the plugin hash doesn't keep breaking
(pkgs.caddy.overrideAttrs rec {
version = "2.10.2";
src = fetchFromGitHub {
owner = "caddyserver";
repo = "caddy";
tag = "v${version}";
hash = "sha256-KvikafRYPFZ0xCXqDdji1rxlkThEDEOHycK8GP5e8vk=";
};
}).withPlugins
{
plugins = [ "github.com/caddy-dns/cloudflare@v0.2.1" ];
hash = "sha256-Zls+5kWd/JSQsmZC4SRQ/WS+pUcRolNaaI7UQoPzJA0=";
}

View File

@@ -1,41 +0,0 @@
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

@@ -1,25 +0,0 @@
{
"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

@@ -1,26 +0,0 @@
{ 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

@@ -1,25 +0,0 @@
<!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

@@ -1,9 +0,0 @@
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

@@ -6,17 +6,17 @@
# Specify AWS_PROFILE and AWS_REGION before running this script # Specify AWS_PROFILE and AWS_REGION before running this script
aws ec2 describe-instances \ aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" | --filters "Name=instance-state-name,Values=running" |
jq -r \ jq -r \
'.Reservations[] '.Reservations[]
| .Instances[] | .Instances[]
| .InstanceId + " - " + | .InstanceId + " - " +
(.PrivateIpAddress // "n/a") + " - " + (.PrivateIpAddress // "n/a") + " - " +
(.PublicIpAddress // "n/a") + " - " + (.PublicIpAddress // "n/a") + " - " +
(.Tags // [] | from_entries | .Name // "n/a")' | (.Tags // [] | from_entries | .Name // "n/a")' |
fzf \ fzf \
--height 100% \ --height 100% \
--layout reverse \ --layout reverse \
--header $'Press Enter to start SSM session\nInstance ID - Private IP - Public IP - Name' \ --header $'Press Enter to start SSM session\nInstance ID - Private IP - Public IP - Name' \
--preview "aws ec2 describe-instances --instance-ids \"\$(echo {} | cut -d' ' -f1)\" | jq -r '.Reservations[].Instances[0]'" \ --preview "aws ec2 describe-instances --instance-ids \"\$(echo {} | cut -d' ' -f1)\" | jq -r '.Reservations[].Instances[0]'" \
--bind "enter:become(aws ssm start-session --document-name 'AWS-StartInteractiveCommand' --parameters '{\"command\": [\"bash\"]}' --target \$(echo {} | cut -d' ' -f1))" --bind "enter:become(aws ssm start-session --target \$(echo {} | cut -d' ' -f1))"

View File

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

View File

@@ -1,7 +1,7 @@
{ pkgs, ... }: { pkgs, ... }:
pkgs.writeShellScriptBin "rebuild" '' pkgs.writeShellScriptBin "rebuild" ''
echo ${pkgs.stdenv.hostPlatform.system} echo ${pkgs.system}
SYSTEM=${if pkgs.stdenv.isDarwin then "darwin" else "linux"} SYSTEM=${if pkgs.stdenv.isDarwin then "darwin" else "linux"}
if [ "$SYSTEM" == "darwin" ]; then if [ "$SYSTEM" == "darwin" ]; then
sudo darwin-rebuild switch --flake ${builtins.toString ../../../../.} sudo darwin-rebuild switch --flake ${builtins.toString ../../../../.}

View File

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

View File

@@ -174,10 +174,8 @@ in
filters = { filters = {
"text/plain" = "${pkgs.aerc}/libexec/aerc/filters/colorize"; "text/plain" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
"text/calendar" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/libexec/aerc/filters/calendar"; "text/calendar" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/libexec/aerc/filters/calendar";
# "text/html" =
# "${pkgs.aerc}/libexec/aerc/filters/html | ${pkgs.aerc}/libexec/aerc/filters/colorize"; # Requires w3m, dante
"text/html" = "text/html" =
"!${pkgs.chawan}/bin/cha --type text/html --opt display.image-mode=kitty --opt display.columns=100 --opt display.force-columns=true"; "${pkgs.aerc}/libexec/aerc/filters/html | ${pkgs.aerc}/libexec/aerc/filters/colorize"; # Requires w3m, dante
# "text/*" = # "text/*" =
# ''${pkgs.bat}/bin/bat -fP --file-name="$AERC_FILENAME "''; # ''${pkgs.bat}/bin/bat -fP --file-name="$AERC_FILENAME "'';
"message/delivery-status" = "${pkgs.aerc}/libexec/aerc/filters/colorize"; "message/delivery-status" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
@@ -204,7 +202,7 @@ in
xdg.desktopEntries.aerc = lib.mkIf (pkgs.stdenv.isLinux) { xdg.desktopEntries.aerc = lib.mkIf (pkgs.stdenv.isLinux) {
name = "aerc"; name = "aerc";
exec = "${lib.getExe config.nmasur.presets.services.i3.terminal} -e aerc %u"; exec = "${lib.getExe config.nmasur.presets.services.i3.terminal} aerc %u";
}; };
xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux { xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
"${config.xsession.windowManager.i3.config.modifier}+Shift+e" = "${config.xsession.windowManager.i3.config.modifier}+Shift+e" =
@@ -214,7 +212,7 @@ in
if terminal == pkgs.wezterm then if terminal == pkgs.wezterm then
"start --class com.noah.aerc -- aerc" "start --class com.noah.aerc -- aerc"
else else
"--class=com.noah.aerc -e aerc"; "--class=com.noah.aerc --command=aerc";
in in
"exec ${ "exec ${
# Don't name the script `aerc` or it will affect grep # Don't name the script `aerc` or it will affect grep

View File

@@ -32,6 +32,7 @@ in
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
accounts.calendar.accounts.default = { accounts.calendar.accounts.default = {
basePath = "other/calendars"; # Where to save calendars in ~ directory
name = "personal"; name = "personal";
local.type = "filesystem"; local.type = "filesystem";
primary = true; primary = true;

View File

@@ -27,7 +27,6 @@ in
rustfmt rustfmt
pkg-config pkg-config
openssl openssl
rust-analyzer
]; ];
}; };
} }

View File

@@ -1,34 +0,0 @@
{
config,
pkgs,
lib,
...
}:
let
cfg = config.nmasur.presets.programs.chawan;
in
{
options.nmasur.presets.programs.chawan.enable = lib.mkEnableOption "chawan TUI web browser";
config = lib.mkIf cfg.enable {
programs.chawan = {
enable = true;
settings = {
external.copy-cmd = if pkgs.stdenv.isLinux then "xclip -selection clipboard -in" else "pbcopy";
};
};
# Set Chawan as the default app for manual pages
home.sessionVariables = {
MANPAGER = "${lib.getExe pkgs.chawan} -T text/x-ansi";
};
programs.fish.shellAbbrs.man = "mancha";
};
}

View File

@@ -29,7 +29,7 @@ in
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
# Always make the dotfiles directory considered safe for git and direnv # Always make the dotfiles directory considered safe for git and direnv
programs.git.settings.safe.directory = cfg.path; programs.git.extraConfig.safe.directory = cfg.path;
programs.direnv.config.whitelist.prefix = [ cfg.path ]; programs.direnv.config.whitelist.prefix = [ cfg.path ];
home.activation = { home.activation = {

View File

@@ -46,8 +46,6 @@ in
ublacklist ublacklist
vimium vimium
wappalyzer # TODO: only for work profile wappalyzer # TODO: only for work profile
pkgs.nmasur.firefox-history-exporter
# copy-as-markdown
# saml-tracer # saml-tracer
# text-fragment # text-fragment
]; ];
@@ -63,7 +61,6 @@ in
"trailhead.firstrun.didSeeAboutWelcome" = true; # Disable welcome splash "trailhead.firstrun.didSeeAboutWelcome" = true; # Disable welcome splash
"dom.forms.autocomplete.formautofill" = false; # Disable autofill "dom.forms.autocomplete.formautofill" = false; # Disable autofill
"extensions.formautofill.creditCards.enabled" = false; # Disable credit cards "extensions.formautofill.creditCards.enabled" = false; # Disable credit cards
"extensions.autoDisableScopes" = false; # Enable extensions automatically
"dom.payments.defaults.saveAddress" = false; # Disable address save "dom.payments.defaults.saveAddress" = false; # Disable address save
"general.autoScroll" = true; # Drag middle-mouse to scroll "general.autoScroll" = true; # Drag middle-mouse to scroll
"services.sync.prefs.sync.general.autoScroll" = false; # Prevent disabling autoscroll "services.sync.prefs.sync.general.autoScroll" = false; # Prevent disabling autoscroll
@@ -190,7 +187,7 @@ in
xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux { xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
"${config.xsession.windowManager.i3.config.modifier}+Shift+b" = "exec ${ "${config.xsession.windowManager.i3.config.modifier}+Shift+b" = "exec ${
# Don't name the script `firefox` or it will affect grep # Don't name the script `firefox` or it will affect grep
toString ( builtins.toString (
pkgs.writeShellScript "focus-ff.sh" '' pkgs.writeShellScript "focus-ff.sh" ''
count=$(ps aux | grep -c firefox) count=$(ps aux | grep -c firefox)
if [ "$count" -eq 1 ]; then if [ "$count" -eq 1 ]; then

View File

@@ -16,13 +16,12 @@ in
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
# Set the i3 terminal # Set the i3 terminal
nmasur.presets.services.i3.terminal = nmasur.presets.services.i3.terminal = config.programs.ghostty.package;
if pkgs.stdenv.isDarwin then pkgs.alacritty else config.programs.ghostty.package;
programs.ghostty = { programs.ghostty = {
enable = true; enable = true;
package = if pkgs.stdenv.isDarwin then null else pkgs.ghostty; package = if pkgs.stdenv.isDarwin then pkgs.nur.repos.DimitarNestorov.ghostty else pkgs.ghostty;
enableFishIntegration = true; enableFishIntegration = true;
enableBashIntegration = true; enableBashIntegration = true;
@@ -38,8 +37,8 @@ in
fullscreen = if pkgs.stdenv.isDarwin then true else false; fullscreen = if pkgs.stdenv.isDarwin then true else false;
keybind = [ keybind = [
"super+t=unbind" # Pass super-t to underlying tool (e.g. zellij tabs) "super+t=unbind" # Pass super-t to underlying tool (e.g. zellij tabs)
"super+shift+bracket_right=unbind" "super+shift+]=unbind"
"super+shift+bracket_left=unbind" "super+shift+[=unbind"
"ctrl+tab=unbind" "ctrl+tab=unbind"
"ctrl+shift+tab=unbind" "ctrl+shift+tab=unbind"
"ctrl+tab=text:\\x1b[9;5u" "ctrl+tab=text:\\x1b[9;5u"

View File

@@ -39,8 +39,8 @@ in
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
programs.git = { programs.git = {
settings.user.name = lib.mkForce cfg.work.name; userName = lib.mkForce cfg.work.name;
settings.user.email = lib.mkForce cfg.work.email; userEmail = lib.mkForce cfg.work.email;
includes = [ includes = [
{ {
path = "${config.home.homeDirectory}/${config.xdg.configFile."git/personal".target}"; path = "${config.home.homeDirectory}/${config.xdg.configFile."git/personal".target}";

View File

@@ -29,11 +29,9 @@ in
programs.git = { programs.git = {
enable = true; enable = true;
settings = { userName = cfg.name;
user = { userEmail = cfg.email;
name = cfg.name; extraConfig = {
email = cfg.email;
};
core.pager = "${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight | less --no-init"; core.pager = "${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight | less --no-init";
interactive.difffilter = "${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight"; interactive.difffilter = "${pkgs.git}/share/git/contrib/diff-highlight/diff-highlight";
pager = { pager = {

View File

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

View File

@@ -7,62 +7,6 @@
let let
cfg = config.nmasur.presets.programs.helix; cfg = config.nmasur.presets.programs.helix;
blame_file_pretty = pkgs.writeShellScriptBin "blame_file_pretty" ''
# Source: https://gist.github.com/gloaysa/828707f067e3bb20da18d72fa5d4963a
# Utility for Helix: open the patch for the commit that last touched the current line.
# If the line isnt committed yet, it shows the working-tree diff for THIS file only.
# The script writes the diff to /tmp and prints the absolute path to stdout
# Adjust `context` to see more/fewer unchanged lines around the change (default: 3).
#
# usage: git-file_pretty.sh <file> <line> [context_lines]
# Helix mapping example:
# B = ':open %sh{ ~/.config/helix/utils/git-blame-commit.sh "%{buffer_name}" %{cursor_line} 3 }'
file="$1"
line="$2"
ctx="''${3:-3}"
# blame the exact line
porc="$(git blame -L "$line",+1 --porcelain -- "$file")" || exit 1
sha="$(printf '%s\n' "$porc" | awk 'NR==1{print $1}')"
commit_path="$(printf '%s\n' "$porc" | awk '/^filename /{print substr($0,10); exit}')"
out="/tmp/hx-blame_$(basename "$file")_''${sha:-wt}.diff"
if [ -z "$sha" ] || [ "$sha" = 0000000000000000000000000000000000000000 ] || [ "$sha" = "^" ]; then
# uncommitted line working tree diff for this file
git --no-pager diff --no-color -U"$ctx" -- "$file" > "$out"
else
# committed line only this files patch in that commit
git --no-pager show --no-color -M -C -U"$ctx" "$sha" -- "''${commit_path:-$file}" > "$out"
fi
# "return" the path for :open %sh{}
printf '%s' "$out"
'';
blame_line_pretty = pkgs.writeShellScriptBin "blame_line_pretty" ''
# Source: https://gist.github.com/gloaysa/828707f067e3bb20da18d72fa5d4963a
# Utility for Helix: pretty-print blame info for the line under the cursor.
# Quite basic.
#
# usage: blame_line_pretty <file> <line>
# Helix mapping example:
# b = ":run-shell-command ~/.config/helix/utils/blame_line_pretty.sh %{buffer_name} %{cursor_line}"
file="$1"; line="$2"
out="$(git blame -L "$line",+1 --porcelain -- "$file")" || return 1
sha="$(printf '%s\n' "$out" | awk 'NR==1{print $1}')"
author="$(printf '%s\n' "$out" | awk -F'author ' '/^author /{print $2; exit}')"
epoch="$(printf '%s\n' "$out" | awk '/^author-time /{print $2; exit}')"
# dd-mm-yyyy (macOS `date -r`; fallback to gdate if present)
date="$( (date -r "$epoch" +%d-%m-%Y\ %H:%M 2>/dev/null) || (gdate -d "@$epoch" +%d-%m-%Y\ %H:%M 2>/dev/null) || printf '%s' "$epoch")"
summary="$(printf '%s\n' "$out" | awk -F'summary ' '/^summary /{print $2; exit}')"
change="$(printf '%s\n' "$out" | tail -n 1)"
printf "%s\n%s\n%s\n%s\n%s\n" "$sha" "$author" "$date" "$summary" "$change"
'';
in in
{ {
@@ -72,13 +16,13 @@ in
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
# Use Neovim as the editor for git commit messages # Use Neovim as the editor for git commit messages
programs.git.settings.core.editor = lib.mkForce "${lib.getExe pkgs.helix}"; programs.git.extraConfig.core.editor = lib.mkForce "${lib.getExe pkgs.helix}";
programs.jujutsu.settings.ui.editor = lib.mkForce "${lib.getExe pkgs.helix}"; programs.jujutsu.settings.ui.editor = lib.mkForce "${lib.getExe pkgs.helix}";
# Set Neovim as the default app for text editing and manual pages # Set Neovim as the default app for text editing and manual pages
home.sessionVariables = { home.sessionVariables = {
EDITOR = lib.mkForce "${lib.getExe pkgs.helix}"; EDITOR = lib.mkForce "${lib.getExe pkgs.helix}";
# MANPAGER = lib.mkForce "sh -c 'col -bx | ${lib.getExe pkgs.helix}'"; MANPAGER = lib.mkForce "sh -c 'col -bx | ${lib.getExe pkgs.helix}'";
MANWIDTH = 87; MANWIDTH = 87;
MANROFFOPT = "-c"; MANROFFOPT = "-c";
}; };
@@ -102,10 +46,6 @@ in
command = "${pkgs.nixd}/bin/nixd"; command = "${pkgs.nixd}/bin/nixd";
}; };
language-server.ty = {
command = "${pkgs.ty}/bin/ty";
};
language-server.fish-lsp = { language-server.fish-lsp = {
command = "${pkgs.fish-lsp}/bin/fish-lsp"; command = "${pkgs.fish-lsp}/bin/fish-lsp";
}; };
@@ -118,14 +58,8 @@ in
command = lib.getExe pkgs.marksman; command = lib.getExe pkgs.marksman;
}; };
language-server.rumdl = {
command = lib.getExe pkgs.rumdl;
args = [ "server" ];
};
language-server.terraform-ls = { language-server.terraform-ls = {
command = "${lib.getExe pkgs.terraform-ls}"; command = "${lib.getExe pkgs.terraform-ls} serve";
args = [ "serve" ];
}; };
language-server.bash-language-server = { language-server.bash-language-server = {
@@ -148,16 +82,10 @@ in
{ {
name = "markdown"; name = "markdown";
auto-format = false; auto-format = false;
language-servers = [ language-servers = [ "marksman" ];
"marksman"
"rumdl"
];
formatter = { formatter = {
command = lib.getExe pkgs.rumdl; command = lib.getExe pkgs.mdformat;
args = [ args = [ "-" ];
"fmt"
"-"
];
}; };
# Allows return key to continue the token on the next line # Allows return key to continue the token on the next line
comment-tokens = [ comment-tokens = [
@@ -169,18 +97,9 @@ in
]; ];
} }
{ {
name = "hcl"; name = "tfvars";
scope = "source.hcl";
# injection-regex = "terraform";
auto-format = true; auto-format = true;
language-servers = [ "terraform-ls" ]; language-servers = [ "terraform-ls" ];
language-id = "terraform";
file-types = [
"tf"
"tfvars"
"terraform"
{ glob = "*.auto.tfvars"; }
];
formatter = { formatter = {
command = lib.getExe pkgs.terraform; command = lib.getExe pkgs.terraform;
args = [ args = [
@@ -190,15 +109,11 @@ in
}; };
} }
{ {
name = "hcl-packer"; name = "hcl";
scope = "source.hcl-packer";
auto-format = true; auto-format = true;
file-types = [ language-servers = [ "terraform-ls" ];
"hcl"
"pkr.hcl"
];
formatter = { formatter = {
command = "${pkgs.packer}/bin/packer"; command = lib.getExe pkgs.terraform;
args = [ args = [
"fmt" "fmt"
"-" "-"
@@ -259,9 +174,18 @@ in
]; ];
# Commandline git blame # Commandline git blame
# space.B = ":echo %sh{git log -n1 --date=short --pretty=format:'%%h %%ad %%s' $(git blame -L %{cursor_line},+1 \"%{buffer_name}\" | cut -d' ' -f1)}"; space.B = ":echo %sh{git log -n1 --date=short --pretty=format:'%%h %%ad %%s' $(git blame -L %{cursor_line},+1 \"%{buffer_name}\" | cut -d' ' -f1)}";
space.B = '':open %sh{ ${blame_line_pretty}/bin/blame_line_pretty "%{buffer_name}" %{cursor_line} 3 }'';
space.i = '':open %sh{ ${blame_file_pretty}/bin/blame_file_pretty "%{buffer_name}" %{cursor_line} 3 }''; # Open yazi
# https://github.com/sxyazi/yazi/pull/2461
# Won't work until next Helix release
C-y = [
":sh rm -f /tmp/unique-file"
":insert-output ${lib.getExe pkgs.yazi} %{buffer_name} --chooser-file=/tmp/unique-file"
":insert-output echo \\x1b[?1049h\\x1b[?2004h > /dev/tty"
":open %sh{cat /tmp/unique-file}"
":redraw"
];
# Extend selection above # Extend selection above
X = "select_line_above"; X = "select_line_above";
@@ -327,10 +251,6 @@ in
git-exclude = true; # Skip excluded files git-exclude = true; # Skip excluded files
}; };
completion-replace = true; # Replace whole word with completion
trim-trailing-whitespace = true;
# rainbow-brackets = true; # Make it easier to match parentheses
# Show whitespace visible to the user # Show whitespace visible to the user
# Waiting for trailing whitespace option ideally # Waiting for trailing whitespace option ideally
whitespace = { whitespace = {
@@ -347,7 +267,7 @@ in
}; };
themes.base16 = { themes."${config.programs.helix.settings.theme}" = {
"attributes" = config.theme.colors.base09; "attributes" = config.theme.colors.base09;
"comment" = { "comment" = {
fg = config.theme.colors.base03; fg = config.theme.colors.base03;
@@ -527,220 +447,8 @@ 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
# (Requires launching the terminal and then executing Helix)
xdg.desktopEntries.helix =
lib.mkIf (pkgs.stdenv.isLinux && config.nmasur.presets.services.i3.enable)
{
name = "Helix wrapper";
exec = ''sh -c "${lib.getExe config.nmasur.presets.services.i3.terminal} --command='hx \$1'" _ %F ''; # TODO: change to work for any terminal
mimeType = [
"text/plain"
"text/markdown"
];
};
xdg.mimeApps.defaultApplications = {
"text/plain" = lib.mkBefore [ "Helix.desktop" ];
"text/markdown" = lib.mkBefore [ "Helix.desktop" ];
};
home.packages = [
(pkgs.writers.writeDashBin "xterm" ''${lib.getExe config.nmasur.presets.services.i3.terminal} +new-window --command"$@" '')
];
}; };
} }

View File

@@ -20,8 +20,8 @@ in
# https://github.com/martinvonz/jj/blob/main/docs/config.md # https://github.com/martinvonz/jj/blob/main/docs/config.md
settings = { settings = {
user = { user = {
name = config.programs.git.settings.user.name; name = config.programs.git.userName;
email = config.programs.git.settings.user.email; email = config.programs.git.userEmail;
}; };
ui.paginate = "never"; ui.paginate = "never";
@@ -34,9 +34,6 @@ in
home.packages = [ home.packages = [
# Required for the fsmonitor to auto-snapshot # Required for the fsmonitor to auto-snapshot
pkgs.watchman pkgs.watchman
# Required to be on path to work in Zellij
pkgs.jjui
]; ];
}; };

View File

@@ -38,13 +38,13 @@ in
); );
# Use Neovim as the editor for git commit messages # Use Neovim as the editor for git commit messages
programs.git.settings.core.editor = "${lib.getExe cfg.package}"; programs.git.extraConfig.core.editor = "${lib.getExe cfg.package}";
programs.jujutsu.settings.ui.editor = "${lib.getExe cfg.package}"; programs.jujutsu.settings.ui.editor = "${lib.getExe cfg.package}";
# Set Neovim as the default app for text editing and manual pages # Set Neovim as the default app for text editing and manual pages
home.sessionVariables = { home.sessionVariables = {
EDITOR = "${lib.getExe cfg.package}"; EDITOR = "${lib.getExe cfg.package}";
# MANPAGER = "${lib.getExe cfg.package} +Man!"; MANPAGER = "${lib.getExe cfg.package} +Man!";
}; };
# Create quick aliases for launching Neovim # Create quick aliases for launching Neovim
@@ -66,7 +66,7 @@ in
lib.mkIf (pkgs.stdenv.isLinux && config.nmasur.presets.services.i3.enable) lib.mkIf (pkgs.stdenv.isLinux && config.nmasur.presets.services.i3.enable)
{ {
name = "Neovim wrapper"; name = "Neovim wrapper";
exec = ''${lib.getExe config.nmasur.presets.services.i3.terminal} --command="nvim %F"''; # TODO: change to generic exec = "${lib.getExe config.nmasur.presets.services.i3.terminal} nvim %F"; # TODO: change to generic
mimeType = [ mimeType = [
"text/plain" "text/plain"
"text/markdown" "text/markdown"

View File

@@ -29,18 +29,6 @@ in
doas nixos-rebuild switch --flake ${config.nmasur.presets.programs.dotfiles.path} doas nixos-rebuild switch --flake ${config.nmasur.presets.programs.dotfiles.path}
''; '';
}; };
rebuildNixosAndPause = lib.mkOption {
type = lib.types.package;
default = pkgs.writeShellScriptBin "rebuild-nixos-pause" ''
${lib.getExe cfg.commands.rebuildNixos} || read
'';
};
rebuildHomeAndPause = lib.mkOption {
type = lib.types.package;
default = pkgs.writeShellScriptBin "rebuild-home-pause" ''
${lib.getExe cfg.commands.rebuildHome} || read
'';
};
}; };
}; };

View File

@@ -22,6 +22,6 @@ in
# Broken on 2023-12-11 # Broken on 2023-12-11
# https://forum.obsidian.md/t/electron-25-is-now-eol-please-upgrade-to-a-newer-version/72878/8 # https://forum.obsidian.md/t/electron-25-is-now-eol-please-upgrade-to-a-newer-version/72878/8
# allowInsecurePackages = [ "electron-36.9.5" ]; # insecurePackages = [ "electron-25.9.0" ];
}; };
} }

View File

@@ -1,17 +0,0 @@
-----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

@@ -1,106 +0,0 @@
{
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,7 +16,6 @@ in
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
programs.zed-editor = { programs.zed-editor = {
enable = true; enable = true;
package = pkgs.stable.zed-editor;
extensions = [ extensions = [
"nix" "nix"

View File

@@ -6,7 +6,6 @@
}: }:
let let
inherit (config.nmasur.settings) username;
cfg = config.nmasur.presets.programs.zellij; cfg = config.nmasur.presets.programs.zellij;
zellij-switch-to-last = pkgs.writeShellScriptBin "zellij-switch-to-last" '' zellij-switch-to-last = pkgs.writeShellScriptBin "zellij-switch-to-last" ''
@@ -54,8 +53,6 @@ in
}; };
}; };
programs.ghostty.settings.initial-command = lib.getExe pkgs.zellij;
xdg.configFile."zellij/layouts/compact-top.kdl".text = # kdl xdg.configFile."zellij/layouts/compact-top.kdl".text = # kdl
'' ''
layout { layout {
@@ -88,7 +85,7 @@ in
enableFishIntegration = true; enableFishIntegration = true;
enableZshIntegration = true; enableZshIntegration = true;
attachExistingSession = true; attachExistingSession = true;
exitShellOnExit = true; exitShellOnExit = false;
settings = { settings = {
default_mode = "locked"; default_mode = "locked";
@@ -124,15 +121,9 @@ in
shared = { shared = {
"bind \"Alt Shift s\"" = { "bind \"Alt Shift s\"" = {
Run = { Run = {
_args = _args = [
if pkgs.stdenv.isDarwin then (lib.getExe zellij-switch-to-last)
[ ];
"env"
"PATH=/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin:/usr/bin:/bin"
(lib.getExe zellij-switch-to-last)
]
else
[ (lib.getExe zellij-switch-to-last) ];
close_on_exit = true; close_on_exit = true;
}; };
}; };
@@ -195,28 +186,9 @@ in
}; };
}; };
"bind \"Alt Shift j\"" = { "bind \"Alt Shift j\"" = {
Run = {
_args =
if pkgs.stdenv.isDarwin then
[
"env"
"PATH=${config.home.homeDirectory}/.nix-profile/bin:/etc/profiles/per-user/${username}/bin:/usr/bin"
(lib.getExe pkgs.jjui)
]
else
[ (lib.getExe pkgs.jjui) ];
close_on_exit = true;
floating = true;
x = "1%";
y = "1%";
width = "99%";
height = "99%";
};
};
"bind \"Alt Shift y\"" = {
Run = { Run = {
_args = [ _args = [
(lib.getExe pkgs.yazi) (lib.getExe pkgs.lazyjj)
]; ];
close_on_exit = true; close_on_exit = true;
floating = true; floating = true;
@@ -271,16 +243,6 @@ in
_args = [ "Left" ]; _args = [ "Left" ];
}; };
}; };
"bind \"Alt j\"" = {
MoveFocus = {
_args = [ "Down" ];
};
};
"bind \"Alt k\"" = {
MoveFocus = {
_args = [ "Up" ];
};
};
}; };
}; };

View File

@@ -57,7 +57,7 @@ function obj:init()
self.launcher:bind("ctrl", "space", function() end) self.launcher:bind("ctrl", "space", function() end)
self.launcher:bind("", "return", function() self.launcher:bind("", "return", function()
-- self:switch("@wezterm@") -- self:switch("@wezterm@")
self:switch("/Applications/Ghostty.app") self:switch("@ghostty@")
end) end)
self.launcher:bind("", "C", function() self.launcher:bind("", "C", function()
self:switch("Calendar.app") self:switch("Calendar.app")

View File

@@ -23,10 +23,11 @@ in
{ {
discord = "${pkgs.discord}/Applications/Discord.app"; discord = "${pkgs.discord}/Applications/Discord.app";
firefox = "${pkgs.firefox-unwrapped}/Applications/Firefox.app"; firefox = "${pkgs.firefox-unwrapped}/Applications/Firefox.app";
ghostty = "${config.programs.ghostty.package}/Applications/Ghostty.app";
obsidian = "${pkgs.obsidian}/Applications/Obsidian.app"; obsidian = "${pkgs.obsidian}/Applications/Obsidian.app";
slack = "${pkgs.slack}/Applications/Slack.app"; slack = "${pkgs.slack}/Applications/Slack.app";
wezterm = "${pkgs.wezterm}/Applications/WezTerm.app"; wezterm = "${pkgs.wezterm}/Applications/WezTerm.app";
zed = "${config.programs.zed-editor.package}/Applications/Zed.app"; zed = "${pkgs.zed-editor}/Applications/Zed.app";
}; };
xdg.configFile."hammerspoon/Spoons/MoveWindow.spoon".source = ./Spoons/MoveWindow.spoon; xdg.configFile."hammerspoon/Spoons/MoveWindow.spoon".source = ./Spoons/MoveWindow.spoon;

View File

@@ -214,9 +214,9 @@ in
cfg.commands.lockScreen != null cfg.commands.lockScreen != null
) "exec ${cfg.commands.lockScreen}"; ) "exec ${cfg.commands.lockScreen}";
"${modifier}+Mod1+h" = "${modifier}+Mod1+h" =
''exec --no-startup-id ${lib.getExe cfg.terminal} -e "${lib.getExe config.nmasur.presets.programs.nixpkgs.commands.rebuildHome} ''; ''exec --no-startup-id ${lib.getExe cfg.terminal} --command="${pkgs.home-manager}/bin/home-manager switch --flake ${config.nmasur.presets.programs.dotfiles.path}#''${hostname} || read" '';
"${modifier}+Mod1+r" = "${modifier}+Mod1+r" =
"exec --no-startup-id ${lib.getExe cfg.terminal} -e ${lib.getExe config.nmasur.presets.programs.nixpkgs.commands.rebuildNixos}"; "exec --no-startup-id ${lib.getExe cfg.terminal} --command='doas nixos-rebuild switch --flake ${config.nmasur.presets.programs.dotfiles.path} || read'";
# Window options # Window options
"${modifier}+q" = "kill"; "${modifier}+q" = "kill";

View File

@@ -33,7 +33,6 @@ in
nmasur.presets = { nmasur.presets = {
programs = { programs = {
bat.enable = lib.mkDefault true; bat.enable = lib.mkDefault true;
chawan.enable = lib.mkDefault true;
fd.enable = lib.mkDefault true; fd.enable = lib.mkDefault true;
ripgrep.enable = lib.mkDefault true; ripgrep.enable = lib.mkDefault true;
starship.enable = lib.mkDefault true; starship.enable = lib.mkDefault true;

View File

@@ -19,10 +19,6 @@ in
pkgs.pgcli # Postgres client with autocomplete pkgs.pgcli # Postgres client with autocomplete
]; ];
nmasur.presets = {
programs.cargo.enable = lib.mkDefault true;
};
}; };
} }

View File

@@ -17,6 +17,7 @@ in
nmasur.presets.programs = { nmasur.presets.programs = {
zed-editor.enable = lib.mkDefault true; zed-editor.enable = lib.mkDefault true;
jujutsu.enable = lib.mkDefault true;
}; };
home.packages = [ home.packages = [
@@ -27,12 +28,6 @@ in
pkgs.skate # Key-value store pkgs.skate # Key-value store
pkgs.charm # Manage account and filesystem pkgs.charm # Manage account and filesystem
pkgs.pop # Send emails from a TUI 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,7 +32,6 @@ in
nsxiv.enable = lib.mkDefault true; nsxiv.enable = lib.mkDefault true;
obsidian.enable = lib.mkDefault true; obsidian.enable = lib.mkDefault true;
rofi.enable = lib.mkDefault true; rofi.enable = lib.mkDefault true;
thunderbird.enable = lib.mkDefault true;
xclip.enable = lib.mkDefault true; xclip.enable = lib.mkDefault true;
zathura.enable = lib.mkDefault true; zathura.enable = lib.mkDefault true;
}; };

View File

@@ -16,17 +16,16 @@ in
pkgs.age # Encryption pkgs.age # Encryption
pkgs.bc # Calculator pkgs.bc # Calculator
pkgs.bottom # System monitor (top) pkgs.bottom # System monitor (top)
pkgs.csvlens # CSV viewer (easier than visidata)
pkgs.delta # Fancy diffs pkgs.delta # Fancy diffs
pkgs.difftastic # Other fancy diffs pkgs.difftastic # Other fancy diffs
pkgs.doggo # DNS client (dig) pkgs.doggo # DNS client (dig)
pkgs.dust # Disk usage tree (ncdu) pkgs.du-dust # Disk usage tree (ncdu)
pkgs.dua # File sizes (du) pkgs.dua # File sizes (du)
pkgs.duf # Basic disk information (df) pkgs.duf # Basic disk information (df)
pkgs.jless # JSON viewer pkgs.jless # JSON viewer
pkgs.jo # JSON output pkgs.jo # JSON output
pkgs.mpd # TUI slideshows pkgs.mpd # TUI slideshows
pkgs.nixfmt # Format Nix code pkgs.nixfmt-rfc-style # Format Nix code
pkgs.nmasur.jqr # FZF fq JSON tool pkgs.nmasur.jqr # FZF fq JSON tool
pkgs.nmasur.osc # Clipboard over SSH pkgs.nmasur.osc # Clipboard over SSH
pkgs.nmasur.ren-find # Rename files pkgs.nmasur.ren-find # Rename files
@@ -34,7 +33,7 @@ in
pkgs.pandoc # Convert text documents pkgs.pandoc # Convert text documents
pkgs.qrencode # Generate qr codes pkgs.qrencode # Generate qr codes
pkgs.spacer # Output lines in terminal pkgs.spacer # Output lines in terminal
pkgs.stable.tealdeer # Cheatsheets pkgs.tealdeer # Cheatsheets
pkgs.tree # Print tree in terminal pkgs.tree # Print tree in terminal
pkgs.vimv-rs # Batch rename files pkgs.vimv-rs # Batch rename files
pkgs.yazi # TUI file explorer pkgs.yazi # TUI file explorer
@@ -43,7 +42,7 @@ in
programs.fish.shellAliases = { programs.fish.shellAliases = {
"du" = lib.mkDefault (lib.getExe pkgs.dua); "du" = lib.mkDefault (lib.getExe pkgs.dua);
"ncdu" = lib.mkDefault (lib.getExe pkgs.dust); "ncdu" = lib.mkDefault (lib.getExe pkgs.du-dust);
"df" = lib.mkDefault (lib.getExe pkgs.duf); "df" = lib.mkDefault (lib.getExe pkgs.duf);
# Use eza (exa) instead of ls for fancier output # Use eza (exa) instead of ls for fancier output
@@ -64,9 +63,8 @@ in
ghostty.enable = lib.mkDefault true; ghostty.enable = lib.mkDefault true;
git.enable = lib.mkDefault true; git.enable = lib.mkDefault true;
helix.enable = lib.mkDefault true; helix.enable = lib.mkDefault true;
jujutsu.enable = lib.mkDefault true;
lazygit.enable = lib.mkDefault true; lazygit.enable = lib.mkDefault true;
# neovim.enable = lib.mkDefault true; neovim.enable = lib.mkDefault true;
nix-index.enable = lib.mkDefault true; nix-index.enable = lib.mkDefault true;
nixpkgs.enable = lib.mkDefault true; nixpkgs.enable = lib.mkDefault true;
notes.enable = lib.mkDefault true; notes.enable = lib.mkDefault true;

View File

@@ -21,7 +21,7 @@ in
]; ];
home.packages = [ home.packages = [
pkgs.stable.visidata # CSV inspector pkgs.visidata # CSV inspector
pkgs.dos2unix # Convert Windows text files pkgs.dos2unix # Convert Windows text files
pkgs.inetutils # Includes telnet pkgs.inetutils # Includes telnet
pkgs.gnupg # Encryption pkgs.gnupg # Encryption
@@ -49,7 +49,6 @@ in
aws-ssh.enable = lib.mkDefault true; aws-ssh.enable = lib.mkDefault true;
bash.enable = lib.mkDefault true; bash.enable = lib.mkDefault true;
bat.enable = lib.mkDefault true; bat.enable = lib.mkDefault true;
cargo.enable = lib.mkDefault true;
direnv.enable = lib.mkDefault true; direnv.enable = lib.mkDefault true;
dotfiles.enable = lib.mkDefault true; dotfiles.enable = lib.mkDefault true;
fd.enable = lib.mkDefault true; fd.enable = lib.mkDefault true;

View File

@@ -23,19 +23,5 @@ in
# Speeds up fish launch time on macOS # Speeds up fish launch time on macOS
programs.fish.useBabelfish = true; 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

@@ -1,70 +0,0 @@
{
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

@@ -1,115 +0,0 @@
# 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

@@ -6,6 +6,7 @@
}: }:
let let
inherit (config.nmasur.settings) username;
cfg = config.nmasur.presets.services.dock; cfg = config.nmasur.presets.services.dock;
in in
@@ -49,7 +50,7 @@ in
"/System/Applications/Messages.app" "/System/Applications/Messages.app"
"/System/Applications/Mail.app" "/System/Applications/Mail.app"
"/Applications/zoom.us.app" "/Applications/zoom.us.app"
"/Applications/Ghostty.app" "${config.home-manager.users.${username}.programs.ghostty.package}/Applications/Ghostty.app"
"${pkgs.discord}/Applications/Discord.app" "${pkgs.discord}/Applications/Discord.app"
"${pkgs.obsidian}/Applications/Obsidian.app" "${pkgs.obsidian}/Applications/Obsidian.app"
]; ];

View File

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

View File

@@ -22,7 +22,6 @@ in
homebrew.enable = lib.mkDefault true; homebrew.enable = lib.mkDefault true;
}; };
services = { services = {
daily-summary.enable = lib.mkDefault true;
dock.enable = lib.mkDefault true; dock.enable = lib.mkDefault true;
finder.enable = lib.mkDefault true; finder.enable = lib.mkDefault true;
hammerspoon.enable = lib.mkDefault true; hammerspoon.enable = lib.mkDefault true;
@@ -40,7 +39,6 @@ in
"scroll-reverser" # Different scroll style for mouse vs. trackpad "scroll-reverser" # Different scroll style for mouse vs. trackpad
"notunes" # Don't launch Apple Music with the play button "notunes" # Don't launch Apple Music with the play button
"topnotch" # Darkens the menu bar to complete black "topnotch" # Darkens the menu bar to complete black
"ghostty" # Terminal application (not buildable on Nix on macOS)
]; ];
}; };

View File

@@ -125,7 +125,7 @@ in
services.cloudflare-dyndns.domains = [ hostnames.budget ]; services.cloudflare-dyndns.domains = [ hostnames.budget ];
# Backups # Backups
services.restic.backups.default.paths = [ "/var/lib/private/actual" ]; services.restic.backups.default.paths = [ "/var/lib/actual" ];
}; };

View File

@@ -24,7 +24,6 @@ let
hostnames.download hostnames.download
hostnames.photos hostnames.photos
hostnames.audiobooks hostnames.audiobooks
hostnames.paperless
]; ];
mkRecord = service: "${service} A ${localIp}"; mkRecord = service: "${service} A ${localIp}";
localRecords = lib.concatLines (map mkRecord localServices); localRecords = lib.concatLines (map mkRecord localServices);

View File

@@ -58,7 +58,6 @@ in
{ {
handler = "static_response"; handler = "static_response";
status_code = "403"; status_code = "403";
body = "IP not allowed";
} }
]; ];
} }
@@ -110,95 +109,96 @@ in
apps.tls.automation.policies = cfg.tlsPolicies; apps.tls.automation.policies = cfg.tlsPolicies;
# Setup logging to journal and files # Setup logging to journal and files
logging.logs = { logging.logs =
# System logs and catch-all {
# Must be called `default` to override Caddy's built-in default logger # System logs and catch-all
default = { # Must be called `default` to override Caddy's built-in default logger
level = "INFO"; default = {
encoder.format = "console"; level = "INFO";
writer = { encoder.format = "console";
output = "stderr"; writer = {
output = "stderr";
};
exclude = (map (hostname: "http.log.access.${hostname}") (builtins.attrNames hostname_map)) ++ [
"http.log.access.${default_logger_name}"
];
}; };
exclude = (map (hostname: "http.log.access.${hostname}") (builtins.attrNames hostname_map)) ++ [ # This is for the default access logs (anything not captured by hostname)
"http.log.access.${default_logger_name}" other = {
]; level = "INFO";
}; encoder.format = "json";
# This is for the default access logs (anything not captured by hostname) writer = {
other = { 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: {
level = "INFO"; level = "INFO";
encoder.format = "json"; encoder.format = "json";
writer = { writer = {
output = "file"; output = "file";
filename = "${config.services.caddy.logDir}/other.log"; filename = "${config.services.caddy.logDir}/${name}-access.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; roll = true;
inherit roll_size_mb; inherit roll_size_mb;
}; };
include = [ "http.log.access.${name}" ]; include = [ "http.log.access.${name}" ];
}; }) hostname_map)
}) 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);
} }
); );
}; };

View File

@@ -66,7 +66,10 @@ in
nmasur.presets.services.caddy.cidrAllowlist = cloudflareIpRanges; nmasur.presets.services.caddy.cidrAllowlist = cloudflareIpRanges;
# Tell Caddy to use Cloudflare DNS for ACME challenge validation # Tell Caddy to use Cloudflare DNS for ACME challenge validation
services.caddy.package = pkgs.nmasur.caddy; services.caddy.package = pkgs.caddy.withPlugins {
plugins = [ "github.com/caddy-dns/cloudflare@v0.2.1" ];
hash = "sha256-AcWko5513hO8I0lvbCLqVbM1eWegAhoM0J0qXoWL/vI=";
};
nmasur.presets.services.caddy.tlsPolicies = [ nmasur.presets.services.caddy.tlsPolicies = [
{ {
issuers = [ issuers = [
@@ -173,16 +176,5 @@ in
# Enable the home-made service that we created for non-proxied records # Enable the home-made service that we created for non-proxied records
services.cloudflare-dyndns-noproxy.enable = true; 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

@@ -29,7 +29,7 @@ in
caps caps
) )
(defalias (defalias
escctrl (tap-hold-press 200 200 esc lctrl) escctrl (tap-hold-press 1000 1000 esc lctrl)
) )
(deflayer base (deflayer base
@escctrl @escctrl

View File

@@ -10,8 +10,8 @@ in
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
# Use power button to sleep instead of poweroff # Use power button to sleep instead of poweroff
services.logind.settings.Login.HandlePowerKey = "suspend"; services.logind.powerKey = "suspend";
services.logind.settings.Login.HandlePowerKeyLongPress = "poweroff"; services.logind.powerKeyLongPress = "poweroff";
}; };

View File

@@ -1,40 +0,0 @@
{ config, lib, ... }:
let
inherit (config.nmasur.settings) hostnames;
cfg = config.nmasur.presets.services.mealie;
in
{
options.nmasur.presets.services.mealie.enable = lib.mkEnableOption "mealie recipe manager";
config = lib.mkIf cfg.enable {
services.mealie = {
enable = true;
port = 9099;
database.createLocally = true;
listenAddress = "127.0.0.1";
};
nmasur.presets.services.caddy.routes = [
{
match = [ { host = [ hostnames.recipes ]; } ];
handle = [
{
handler = "reverse_proxy";
upstreams = [ { dial = "localhost:${builtins.toString config.services.mealie.port}"; } ];
}
];
}
];
# Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ hostnames.recipes ];
# Point localhost to the local domain
networking.hosts."127.0.0.1" = [ hostnames.recipes ];
};
}

View File

@@ -1,41 +0,0 @@
# 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

@@ -2,6 +2,7 @@
# together with triggers. # together with triggers.
{ config, lib, ... }: { config, lib, ... }:
let let
inherit (config.nmasur.settings) hostnames; inherit (config.nmasur.settings) hostnames;
cfg = config.nmasur.presets.services.n8n; cfg = config.nmasur.presets.services.n8n;
@@ -17,14 +18,18 @@ in
services.n8n = { services.n8n = {
enable = true; enable = true;
environment = { webhookUrl = "https://${hostnames.n8n}";
N8N_LISTEN_ADDRESS = "127.0.0.1"; settings = {
N8N_PORT = 5678; listen_address = "127.0.0.1";
N8N_EDITOR_BASE_URL = "https://${hostnames.n8n}"; port = 5678;
N8N_RESTRICT_FILE_ACCESS_TO = "/var/lib/n8n";
}; };
}; };
systemd.services.n8n.environment = {
N8N_EDITOR_BASE_URL = config.services.n8n.webhookUrl;
};
# Configure Cloudflare DNS to point to this machine # Configure Cloudflare DNS to point to this machine
services.cloudflare-dyndns.domains = [ hostnames.n8n ]; services.cloudflare-dyndns.domains = [ hostnames.n8n ];
@@ -35,9 +40,7 @@ in
handle = [ handle = [
{ {
handler = "reverse_proxy"; handler = "reverse_proxy";
upstreams = [ upstreams = [ { dial = "localhost:${builtins.toString config.services.n8n.settings.port}"; } ];
{ dial = "localhost:${toString config.services.n8n.environment.N8N_PORT}"; }
];
} }
]; ];
} }

View File

@@ -17,7 +17,7 @@ in
services.nextcloud = { services.nextcloud = {
enable = true; enable = true;
package = pkgs.nextcloud32; # Required to specify package = pkgs.nextcloud31; # Required to specify
configureRedis = true; configureRedis = true;
datadir = "/data/nextcloud"; datadir = "/data/nextcloud";
database.createLocally = true; database.createLocally = true;

View File

@@ -30,11 +30,9 @@ in
karakeep.enable = lib.mkDefault true; karakeep.enable = lib.mkDefault true;
litestream.enable = lib.mkDefault true; litestream.enable = lib.mkDefault true;
mathesar.enable = lib.mkDefault true; mathesar.enable = lib.mkDefault true;
mealie.enable = lib.mkDefault true; minecraft-server.enable = lib.mkDefault true;
minecraft-server.enable = lib.mkDefault false;
murmur.enable = lib.mkDefault true;
n8n.enable = lib.mkDefault true; n8n.enable = lib.mkDefault true;
nix-autoupgrade.enable = lib.mkDefault true; # On by default for communications nix-autoupgrade.enable = lib.mkDefault false; # On by default for communications
ntfy-sh.enable = lib.mkDefault true; ntfy-sh.enable = lib.mkDefault true;
pgweb.enable = lib.mkDefault true; pgweb.enable = lib.mkDefault true;
postgresql.enable = lib.mkDefault true; postgresql.enable = lib.mkDefault true;

View File

@@ -44,7 +44,7 @@ in
enable = lib.mkDefault (!config.networking.networkmanager.enable); enable = lib.mkDefault (!config.networking.networkmanager.enable);
# Allows the user to control the WiFi settings. # Allows the user to control the WiFi settings.
userControlled = lib.mkDefault true; userControlled.enable = lib.mkDefault true;
}; };
# Wake up tempest with a command # Wake up tempest with a command

View File

@@ -18,7 +18,7 @@
pkgs = import nixpkgs { inherit system; }; pkgs = import nixpkgs { inherit system; };
in in
{ {
default = pkgs.mkShell { buildInputs = with pkgs; [ nixfmt ]; }; default = pkgs.mkShell { buildInputs = with pkgs; [ nixfmt-rfc-style ]; };
} }
); );
}; };