summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--files/CACerts/RyanCA.crt11
-rw-r--r--flake.lock296
-rw-r--r--flake.nix45
-rw-r--r--hosts/RyanMac/configuration.nix212
-rw-r--r--users/ryan/aerc/accounts.conf24
-rw-r--r--users/ryan/aerc/aerc.conf569
-rw-r--r--users/ryan/aerc/binds.conf150
-rw-r--r--users/ryan/aerc/signature_personal4
-rw-r--r--users/ryan/aerc/signature_rit_personal6
-rw-r--r--users/ryan/aerc/templates/quoted_reply7
-rw-r--r--users/ryan/home.nix126
-rw-r--r--users/ryan/zen/zenPolicies.nix125
-rw-r--r--users/ryan/zen/zenProfile.nix71
13 files changed, 1646 insertions, 0 deletions
diff --git a/files/CACerts/RyanCA.crt b/files/CACerts/RyanCA.crt
new file mode 100644
index 0000000..7fa09c1
--- /dev/null
+++ b/files/CACerts/RyanCA.crt
@@ -0,0 +1,11 @@
1-----BEGIN CERTIFICATE-----
2MIIBmDCCAT2gAwIBAgIQIq6m5IB0yZ1181RHpL6jyjAKBggqhkjOPQQDAjAqMQ8w
3DQYDVQQKEwZSeWFuQ0ExFzAVBgNVBAMTDlJ5YW5DQSBSb290IENBMB4XDTIyMTAx
4OTIzMjIxNFoXDTMyMTAxNjIzMjIxNFowKjEPMA0GA1UEChMGUnlhbkNBMRcwFQYD
5VQQDEw5SeWFuQ0EgUm9vdCBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABAhR
6Z3X7MTDDzvPAuW9JM8Rn4MU283Y3Wa2a1RiyTxo2XGlEB8HPgfL7MwRccUlCiABl
7zPHkaYUvrjJrq7PjsuejRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG
8AQH/AgEBMB0GA1UdDgQWBBS4/S97d94NQoK+G+Lh9T76LVCxXDAKBggqhkjOPQQD
9AgNJADBGAiEA5WVKjNUN1x4+X17XnD+H5QKLgs+M/mFfyk3yPY1aMtoCIQCnGAu9
10wrKUglPbAPcQ1Qs47qeBubJu5um1v+mi0+MGPg==
11-----END CERTIFICATE-----
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..8905305
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,296 @@
1{
2 "nodes": {
3 "darwin": {
4 "inputs": {
5 "nixpkgs": [
6 "nixpkgs"
7 ]
8 },
9 "locked": {
10 "lastModified": 1781242433,
11 "narHash": "sha256-bchLZZ3sRn740zyvD2icZSnNoTaanN0nw7l6fjVXO+E=",
12 "owner": "nix-darwin",
13 "repo": "nix-darwin",
14 "rev": "aabb2037edfc0f210723b72cd5f528aab5dd3f0b",
15 "type": "github"
16 },
17 "original": {
18 "owner": "nix-darwin",
19 "ref": "master",
20 "repo": "nix-darwin",
21 "type": "github"
22 }
23 },
24 "determinate": {
25 "inputs": {
26 "determinate-nixd-aarch64-darwin": "determinate-nixd-aarch64-darwin",
27 "determinate-nixd-aarch64-linux": "determinate-nixd-aarch64-linux",
28 "determinate-nixd-x86_64-linux": "determinate-nixd-x86_64-linux",
29 "nix": "nix",
30 "nixpkgs": "nixpkgs_2"
31 },
32 "locked": {
33 "lastModified": 1780941588,
34 "narHash": "sha256-cXxaBtTSYEYVtSxw4IH0hPa+p+VFxS0i+66GwxVFk7o=",
35 "rev": "70c28bcdd4dde10d04f39e7accb5738a1f5d5298",
36 "revCount": 421,
37 "type": "tarball",
38 "url": "https://api.flakehub.com/f/pinned/DeterminateSystems/determinate/3.21.1/019ea867-5568-7d03-9579-e943ed6d4cef/source.tar.gz"
39 },
40 "original": {
41 "type": "tarball",
42 "url": "https://flakehub.com/f/DeterminateSystems/determinate/3"
43 }
44 },
45 "determinate-nixd-aarch64-darwin": {
46 "flake": false,
47 "locked": {
48 "narHash": "sha256-ctwRrPKWBSFkTqlCHRGz6MHBSWRkbSAEVGoelsxdr2g=",
49 "type": "file",
50 "url": "https://install.determinate.systems/determinate-nixd/tag/v3.21.1/macOS"
51 },
52 "original": {
53 "type": "file",
54 "url": "https://install.determinate.systems/determinate-nixd/tag/v3.21.1/macOS"
55 }
56 },
57 "determinate-nixd-aarch64-linux": {
58 "flake": false,
59 "locked": {
60 "narHash": "sha256-qYFrMN6lSMRYV87D/uK5L2CUBvOpoLZAAfSYXvcp9cc=",
61 "type": "file",
62 "url": "https://install.determinate.systems/determinate-nixd/tag/v3.21.1/aarch64-linux"
63 },
64 "original": {
65 "type": "file",
66 "url": "https://install.determinate.systems/determinate-nixd/tag/v3.21.1/aarch64-linux"
67 }
68 },
69 "determinate-nixd-x86_64-linux": {
70 "flake": false,
71 "locked": {
72 "narHash": "sha256-BxzPf6fT1ekyvD5JA0vvDJOTPtIyjrzVg3Puuo0ftbg=",
73 "type": "file",
74 "url": "https://install.determinate.systems/determinate-nixd/tag/v3.21.1/x86_64-linux"
75 },
76 "original": {
77 "type": "file",
78 "url": "https://install.determinate.systems/determinate-nixd/tag/v3.21.1/x86_64-linux"
79 }
80 },
81 "flake-compat": {
82 "flake": false,
83 "locked": {
84 "lastModified": 1696426674,
85 "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
86 "owner": "edolstra",
87 "repo": "flake-compat",
88 "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
89 "type": "github"
90 },
91 "original": {
92 "owner": "edolstra",
93 "repo": "flake-compat",
94 "type": "github"
95 }
96 },
97 "flake-parts": {
98 "inputs": {
99 "nixpkgs-lib": [
100 "determinate",
101 "nix",
102 "nixpkgs"
103 ]
104 },
105 "locked": {
106 "lastModified": 1748821116,
107 "narHash": "sha256-F82+gS044J1APL0n4hH50GYdPRv/5JWm34oCJYmVKdE=",
108 "rev": "49f0870db23e8c1ca0b5259734a02cd9e1e371a1",
109 "revCount": 377,
110 "type": "tarball",
111 "url": "https://api.flakehub.com/f/pinned/hercules-ci/flake-parts/0.1.377%2Brev-49f0870db23e8c1ca0b5259734a02cd9e1e371a1/01972f28-554a-73f8-91f4-d488cc502f08/source.tar.gz"
112 },
113 "original": {
114 "type": "tarball",
115 "url": "https://flakehub.com/f/hercules-ci/flake-parts/0.1"
116 }
117 },
118 "git-hooks-nix": {
119 "inputs": {
120 "flake-compat": "flake-compat",
121 "gitignore": [
122 "determinate",
123 "nix"
124 ],
125 "nixpkgs": [
126 "determinate",
127 "nix",
128 "nixpkgs"
129 ]
130 },
131 "locked": {
132 "lastModified": 1747372754,
133 "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=",
134 "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46",
135 "revCount": 1026,
136 "type": "tarball",
137 "url": "https://api.flakehub.com/f/pinned/cachix/git-hooks.nix/0.1.1026%2Brev-80479b6ec16fefd9c1db3ea13aeb038c60530f46/0196d79a-1b35-7b8e-a021-c894fb62163d/source.tar.gz"
138 },
139 "original": {
140 "type": "tarball",
141 "url": "https://flakehub.com/f/cachix/git-hooks.nix/0.1.941"
142 }
143 },
144 "home-manager": {
145 "inputs": {
146 "nixpkgs": [
147 "nixpkgs"
148 ]
149 },
150 "locked": {
151 "lastModified": 1781189114,
152 "narHash": "sha256-5inaamLgUMWy+MOBE9ChF9QAF1o/74LFuHkI0W/9rqc=",
153 "owner": "nix-community",
154 "repo": "home-manager",
155 "rev": "486595d2cf49cfcd649b58a284fa11ac0e34da22",
156 "type": "github"
157 },
158 "original": {
159 "owner": "nix-community",
160 "repo": "home-manager",
161 "type": "github"
162 }
163 },
164 "nix": {
165 "inputs": {
166 "flake-parts": "flake-parts",
167 "git-hooks-nix": "git-hooks-nix",
168 "nixpkgs": "nixpkgs",
169 "nixpkgs-23-11": "nixpkgs-23-11",
170 "nixpkgs-regression": "nixpkgs-regression"
171 },
172 "locked": {
173 "lastModified": 1780939209,
174 "narHash": "sha256-/JuW5C6sWuC836Y9b7hga3ZvhRiY4k4Zs73RRg5KVWM=",
175 "rev": "952beffe9c45ed245d30209d4f17cf1d26654a2a",
176 "revCount": 26044,
177 "type": "tarball",
178 "url": "https://api.flakehub.com/f/pinned/DeterminateSystems/nix-src/3.21.1/019ea860-2acd-7680-ae61-10f9574b2694/source.tar.gz"
179 },
180 "original": {
181 "type": "tarball",
182 "url": "https://flakehub.com/f/DeterminateSystems/nix-src/%2A"
183 }
184 },
185 "nixpkgs": {
186 "locked": {
187 "lastModified": 1773222311,
188 "narHash": "sha256-BHoB/XpbqoZkVYZCfXJXfkR+GXFqwb/4zbWnOr2cRcU=",
189 "rev": "0590cd39f728e129122770c029970378a79d076a",
190 "revCount": 909248,
191 "type": "tarball",
192 "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.909248%2Brev-0590cd39f728e129122770c029970378a79d076a/019ce32b-8ace-7339-b129-cceaa8dd10c6/source.tar.gz"
193 },
194 "original": {
195 "type": "tarball",
196 "url": "https://flakehub.com/f/NixOS/nixpkgs/0.2511"
197 }
198 },
199 "nixpkgs-23-11": {
200 "locked": {
201 "lastModified": 1717159533,
202 "narHash": "sha256-oamiKNfr2MS6yH64rUn99mIZjc45nGJlj9eGth/3Xuw=",
203 "owner": "NixOS",
204 "repo": "nixpkgs",
205 "rev": "a62e6edd6d5e1fa0329b8653c801147986f8d446",
206 "type": "github"
207 },
208 "original": {
209 "owner": "NixOS",
210 "repo": "nixpkgs",
211 "rev": "a62e6edd6d5e1fa0329b8653c801147986f8d446",
212 "type": "github"
213 }
214 },
215 "nixpkgs-regression": {
216 "locked": {
217 "lastModified": 1643052045,
218 "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
219 "owner": "NixOS",
220 "repo": "nixpkgs",
221 "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
222 "type": "github"
223 },
224 "original": {
225 "owner": "NixOS",
226 "repo": "nixpkgs",
227 "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
228 "type": "github"
229 }
230 },
231 "nixpkgs_2": {
232 "locked": {
233 "lastModified": 1780336545,
234 "narHash": "sha256-vhVhuXzFrIOfcssC/9hDHx7MHzDKjF3keHuREOQqQiQ=",
235 "rev": "4df1b885d76a54e1aa1a318f8d16fd6005b6401f",
236 "revCount": 1008784,
237 "type": "tarball",
238 "url": "https://api.flakehub.com/f/pinned/DeterminateSystems/nixpkgs-weekly/0.1.1008784%2Brev-4df1b885d76a54e1aa1a318f8d16fd6005b6401f/019e8725-c925-7ec1-8f35-3f9effcf169a/source.tar.gz"
239 },
240 "original": {
241 "type": "tarball",
242 "url": "https://flakehub.com/f/DeterminateSystems/nixpkgs-weekly/0.1"
243 }
244 },
245 "nixpkgs_3": {
246 "locked": {
247 "lastModified": 1781229721,
248 "narHash": "sha256-ORvqDbb/LYxiJljGIejapjkc/kJbVote2N1WSb9W45I=",
249 "owner": "nixos",
250 "repo": "nixpkgs",
251 "rev": "173d0ad7a974f8543a9ab01d2271b2e290341b33",
252 "type": "github"
253 },
254 "original": {
255 "owner": "nixos",
256 "ref": "nixpkgs-unstable",
257 "repo": "nixpkgs",
258 "type": "github"
259 }
260 },
261 "root": {
262 "inputs": {
263 "darwin": "darwin",
264 "determinate": "determinate",
265 "home-manager": "home-manager",
266 "nixpkgs": "nixpkgs_3",
267 "zen-browser": "zen-browser"
268 }
269 },
270 "zen-browser": {
271 "inputs": {
272 "home-manager": [
273 "home-manager"
274 ],
275 "nixpkgs": [
276 "nixpkgs"
277 ]
278 },
279 "locked": {
280 "lastModified": 1781426426,
281 "narHash": "sha256-yzxJMNgv/sLishhCT9G2lm7W9CjHSlXWkfbWC7vfjqc=",
282 "owner": "0xc000022070",
283 "repo": "zen-browser-flake",
284 "rev": "df336067c1a8af3bfce3f0b88b66dc1c57411b4e",
285 "type": "github"
286 },
287 "original": {
288 "owner": "0xc000022070",
289 "repo": "zen-browser-flake",
290 "type": "github"
291 }
292 }
293 },
294 "root": "root",
295 "version": 7
296}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..71006ec
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,45 @@
1{
2 description = "Example nix-darwin system flake";
3
4 inputs = {
5 nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
6 darwin = {
7 url = "github:nix-darwin/nix-darwin/master";
8 inputs.nixpkgs.follows = "nixpkgs";
9 };
10 home-manager = {
11 url = "github:nix-community/home-manager";
12 inputs.nixpkgs.follows = "nixpkgs";
13 };
14 determinate.url = "https://flakehub.com/f/DeterminateSystems/determinate/3";
15 zen-browser = { # Used exclusively for HM module, Zen is installed via cask
16 url = "github:0xc000022070/zen-browser-flake";
17 inputs = {
18 nixpkgs.follows = "nixpkgs";
19 home-manager.follows = "home-manager";
20 };
21 };
22 };
23
24 outputs = { nixpkgs, home-manager, ... }@inputs: {
25 darwinConfigurations."RyanMac" = inputs.darwin.lib.darwinSystem {
26 system = "aarch64-darwin";
27 specialArgs = { inherit inputs; };
28 modules = [
29 inputs.determinate.darwinModules.default
30 ./hosts/RyanMac/configuration.nix
31 home-manager.darwinModules.home-manager
32 {
33 home-manager.useGlobalPkgs = true;
34 home-manager.useUserPackages = true;
35 home-manager.users.ryan = {
36 imports = [
37 inputs.zen-browser.homeModules.beta
38 ./users/ryan/home.nix
39 ];
40 };
41 }
42 ];
43 };
44 };
45}
diff --git a/hosts/RyanMac/configuration.nix b/hosts/RyanMac/configuration.nix
new file mode 100644
index 0000000..572c534
--- /dev/null
+++ b/hosts/RyanMac/configuration.nix
@@ -0,0 +1,212 @@
1{ pkgs, inputs, ... }:
2let
3 username = "ryan";
4
5 defaultBrowser = "zen";
6
7 pinnedNixpkgs = pkgs.writeText "flake-registry.json" (builtins.toJSON {
8 version = 2;
9 flakes = [
10 {
11 from = { type = "indirect"; id = "nixpkgs"; };
12 to = {
13 type = "path";
14 path = inputs.nixpkgs.outPath;
15 lastModified = inputs.nixpkgs.lastModified;
16 narHash = inputs.nixpkgs.narHash;
17 };
18 }
19 ];
20 });
21
22in {
23 # Define the system's user and home dir location
24 users.users."${username}" = {
25 name = "${username}";
26 home = "/Users/${username}";
27 };
28
29 system.primaryUser = "${username}";
30
31 # Install the /etc/nix/flake-registry.json file we made above
32 environment.etc."nix/flake-registry.json".source = pinnedNixpkgs;
33
34 # Install RyanCA Root
35 security.pki.certificateFiles = [
36 ../../files/CACerts/RyanCA.crt
37 ];
38
39 # Need to disable native nix handling because of Determinate nix
40 determinateNix = {
41 enable = true;
42 customSettings = {
43 flake-registry = "/etc/nix/flake-registry.json";
44 };
45 };
46
47 # Determines the nix-darwin release compatibility
48 system.stateVersion = 6;
49
50 # System profile programs
51 programs = {
52 zsh.enable = true;
53 };
54
55 # Install homebrew casks/apps
56 homebrew = {
57 enable = true;
58
59 onActivation = {
60 cleanup = "zap";
61 extraFlags = [ "--force-cleanup" ];
62 };
63
64 casks = [
65 "utm"
66 "ghostty"
67 "zen"
68 ];
69 };
70
71 # Keyboard shortcuts using skhd
72 services.skhd = {
73 enable = true;
74 skhdConfig = ''
75 alt - d : osascript -e 'tell application "System Events" to key code 49 using {command down}'
76 alt - return : open -na /Applications/Ghostty.app
77 '';
78 };
79
80 # System configuration
81 time.timeZone = "America/New_York";
82
83 system.defaults = {
84 NSGlobalDomain = {
85 # 24 hour time
86 AppleICUForce24HourTime = true;
87
88 # Dark Mode
89 AppleInterfaceStyle = "Dark";
90
91 # Key repeat rate
92 KeyRepeat = 4;
93 InitialKeyRepeat = 30;
94
95 # Swap F1-12 to be default
96 "com.apple.keyboard.fnState" = true;
97
98 # Disable Keyboard bullcrap
99 NSAutomaticCapitalizationEnabled = false;
100 NSAutomaticDashSubstitutionEnabled = false;
101 NSAutomaticPeriodSubstitutionEnabled = false;
102 NSAutomaticQuoteSubstitutionEnabled = false;
103 NSAutomaticSpellingCorrectionEnabled = false;
104 ApplePressAndHoldEnabled = false;
105 };
106
107 # Control center stuff
108 controlcenter = {
109 BatteryShowPercentage = true;
110 };
111
112 # Clock settings
113 menuExtraClock = {
114 Show24Hour = true;
115 ShowDate = 1; # Always
116 ShowDayOfWeek = true;
117 ShowSeconds = true;
118 };
119
120 # Screen capture settings
121 screencapture = {
122 target = "clipboard";
123 type = "png";
124 };
125
126 # finder good settings
127 finder = {
128 AppleShowAllExtensions = true;
129 AppleShowAllFiles = true;
130 ShowPathbar = true;
131 FXEnableExtensionChangeWarning = false;
132 _FXShowPosixPathInTitle = true;
133 NewWindowTarget = "Home";
134 ShowExternalHardDrivesOnDesktop = false;
135 ShowHardDrivesOnDesktop = false;
136 ShowMountedServersOnDesktop = false;
137 ShowRemovableMediaOnDesktop = false;
138 ShowStatusBar = true;
139 };
140
141 # Login Window Settings
142 loginwindow = {
143 GuestEnabled = false;
144 DisableConsoleAccess = true;
145 };
146
147 # dock settings
148 dock = {
149 magnification = true;
150 largesize = 96;
151 tilesize = 32;
152 minimize-to-application = false;
153 orientation = "bottom";
154 autohide = true;
155 persistent-apps = [
156 { app = "/Applications/Zen.app"; }
157 #{ app = "/System/Applications/Launchpad.app"; }
158 { app = "/System/Applications/Messages.app"; }
159 { app = "/System/Applications/Facetime.app"; }
160 { app = "/System/Applications/Calendar.app"; }
161 { app = "/System/Applications/App Store.app"; }
162 { app = "/System/Applications/System Settings.app"; }
163 { app = "/Applications/UTM.app"; }
164 ];
165 persistent-others = [
166 { folder = { path = "/Users/${username}/Downloads"; showas = "grid"; arrangement = "date-created"; }; }
167 { folder = { path = "/Applications"; showas = "grid"; arrangement = "name"; }; }
168 ];
169 show-recents = false;
170 };
171
172 # Custom preferences
173 CustomUserPreferences = {
174 NSGlobalDomain = {
175 # Always show menu bar
176 AppleMenuBarVisibleInFullscreen = true;
177 };
178
179 "com.apple.symbolichotkeys" = {
180 AppleSymbolicHotKeys = {
181 "64" = {
182 enabled = true; # skhd needs this for its shortcut
183 };
184 };
185 };
186 };
187 };
188
189 # Post-Activation scripts
190 system.activationScripts.postActivation.text = ''
191 echo "Configuring NTP servers..."
192 systemsetup -setnetworktimeserver pool.ntp.org > /dev/null 2>&1 || true
193 systemsetup -setusingnetworktime on > /dev/null 2>&1 || true
194
195 ryancasum="$(${pkgs.openssl}/bin/openssl x509 -in "${../../files/CACerts/RyanCA.crt}" -noout -fingerprint -sha1 | sed 's/.*=//; s/://g')"
196 if ! /usr/bin/security find-certificate -a -Z "/Library/Keychains/System.keychain" | tr -d ':' | grep -iq "$ryancasum"; then
197 echo "Installing RyanCA Certificate..."
198 /usr/bin/security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ${../../files/CACerts/RyanCA.crt}
199 fi
200
201 echo "Reloading Preferences DB..."
202 /System/Library/PrivateFrameworks/SystemAdministration.framework/Resources/activateSettings -u
203
204 echo "Setting default browser"
205 ${pkgs.defaultbrowser}/bin/defaultbrowser ${defaultBrowser}
206
207 # this is fragile so it goes at the bottom
208 echo "Reloading skhd..."
209 sudo -iu ${username} ${pkgs.skhd}/bin/skhd -r
210 '';
211
212}
diff --git a/users/ryan/aerc/accounts.conf b/users/ryan/aerc/accounts.conf
new file mode 100644
index 0000000..b140dbd
--- /dev/null
+++ b/users/ryan/aerc/accounts.conf
@@ -0,0 +1,24 @@
1[Personal]
2source = jmap://ryan%40rschanz.org@mail.rschanz.org/jmap/session
3source-cred-cmd = pass emails/personal 2>/dev/null | tr -d '\n'
4outgoing = jmap://
5default = Inbox
6from = Ryan Schanzenbacher <ryan@rschanz.org>
7copy-to = Sent
8signature-file = ~/.config/aerc/signature_personal
9#check-mail = 5m
10aliases = Ryan S <ryan+ritlugdemo@rschanz.org>, Ryan Schanzenbacher <ryan+guixdevel@rschanz.org>
11pgp-self-encrypt = true
12
13[School]
14source = imaps+oauthbearer://rjs1877%40rit.edu@imap.gmail.com:993?token_endpoint=https%3A%2F%2Faccounts.google.com%2Fo%2Foauth2%2Ftoken&client_id=667738788924-0rdfvaq9ijfo1vk4474eb3quf8206h2t.apps.googleusercontent.com&client_secret=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
15source-cred-cmd = pass emails/rit_personal 2>/dev/null | tr -d '\n'
16outgoing = smtps+oauthbearer://rjs1877%40rit.edu@imap.gmail.com:465?token_endpoint=https%3A%2F%2Faccounts.google.com%2Fo%2Foauth2%2Ftoken&client_id=667738788924-0rdfvaq9ijfo1vk4474eb3quf8206h2t.apps.googleusercontent.com&client_secret=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
17outgoing-cred-cmd = pass emails/rit_personal 2>/dev/null | tr -d '\n'
18from = Ryan Schanzenbacher <rjs1877@rit.edu>
19signature-file = ~/.config/aerc/signature_rit_personal
20check-mail = 5m
21default = INBOX
22copy-to = [Gmail]/Sent Mail
23pgp-self-encrypt = true
24
diff --git a/users/ryan/aerc/aerc.conf b/users/ryan/aerc/aerc.conf
new file mode 100644
index 0000000..ad54cf7
--- /dev/null
+++ b/users/ryan/aerc/aerc.conf
@@ -0,0 +1,569 @@
1#
2# aerc main configuration
3
4[general]
5#
6# Used as a default path for save operations if no other path is specified.
7# ~ is expanded to the current user home dir.
8#
9default-save-path=~/Downloads/
10
11# If set to "gpg", aerc will use system gpg binary and keystore for all crypto
12# operations. If set to "internal", the internal openpgp keyring will be used.
13# If set to "auto", the system gpg will be preferred unless the internal
14# keyring already exists, in which case the latter will be used.
15#
16# Default: auto
17pgp-provider=gpg
18
19# By default, the file permissions of accounts.conf must be restrictive and
20# only allow reading by the file owner (0600). Set this option to true to
21# ignore this permission check. Use this with care as it may expose your
22# credentials.
23#
24# Default: false
25unsafe-accounts-conf=true # I don't store my creds in this
26
27# Output log messages to specified file. A path starting with ~/ is expanded to
28# the user home dir. When redirecting aerc's output to a file using > shell
29# redirection, this setting is ignored and log messages are printed to stdout.
30#
31#log-file=~/aerc_log
32
33# Only log messages above the specified level to log-file. Supported levels
34# are: trace, debug, info, warn and error. When redirecting aerc's output to
35# a file using > shell redirection, this setting is ignored and the log level
36# is forced to trace.
37#
38# Default: info
39log-level=trace
40
41# Set the $TERM environment variable used for the embedded terminal.
42#
43# Default: xterm-256color
44#term=xterm-256color
45
46# Display OSC8 strings in the embedded terminal
47#
48# Default: false
49#enable-osc8=false
50
51[ui]
52#
53# Describes the format for each row in a mailbox view. This is a comma
54# separated list of column names with an optional align and width suffix. After
55# the column name, one of the '<' (left), ':' (center) or '>' (right) alignment
56# characters can be added (by default, left) followed by an optional width
57# specifier. The width is either an integer representing a fixed number of
58# characters, or a percentage between 1% and 99% representing a fraction of the
59# terminal width. It can also be one of the '*' (auto) or '=' (fit) special
60# width specifiers. Auto width columns will be equally attributed the remaining
61# terminal width. Fit width columns take the width of their contents. If no
62# width specifier is set, '*' is used by default.
63#
64# Default: date<20,name<17,flags>4,subject<*
65#index-columns=date<20,name<17,flags>4,subject<*
66
67spinner = '/,-,\,|'
68
69#
70# Each name in index-columns must have a corresponding column-$name setting.
71# All column-$name settings accept golang text/template syntax. See
72# aerc-templates(7) for available template attributes and functions.
73#
74# Default settings
75#column-date={{.DateAutoFormat .Date.Local}}
76#column-name={{index (.From | names) 0}}
77#column-flags={{.Flags | join ""}}
78#column-subject={{.ThreadPrefix}}{{.Subject}}
79
80#
81# String separator inserted between columns. When the column width specifier is
82# an exact number of characters, the separator is added to it (i.e. the exact
83# width will be fully available for the column contents).
84#
85# Default: " "
86#column-separator=" "
87
88#
89# See time.Time#Format at https://godoc.org/time#Time.Format
90#
91# Default: 2006-01-02 03:04 PM (ISO 8601 + 12 hour time)
92#timestamp-format=2006-01-02 03:04 PM
93
94#
95# Index-only time format for messages that were received/sent today.
96# If this is not specified, timestamp-format is used instead.
97#
98#this-day-time-format=
99
100#
101# Index-only time format for messages that were received/sent within the last
102# 7 days. If this is not specified, timestamp-format is used instead.
103#
104#this-week-time-format=
105
106#
107# Index-only time format for messages that were received/sent this year.
108# If this is not specified, timestamp-format is used instead.
109#
110#this-year-time-format=
111
112#
113# Width of the sidebar, including the border.
114#
115# Default: 20
116#sidebar-width=20
117
118#
119# Message to display when viewing an empty folder.
120#
121# Default: (no messages)
122#empty-message=(no messages)
123
124# Message to display when no folders exists or are all filtered
125#
126# Default: (no folders)
127#empty-dirlist=(no folders)
128
129# Enable mouse events in the ui, e.g. clicking and scrolling with the mousewheel
130#
131# Default: false
132#mouse-enabled=false
133
134#
135# Ring the bell when new messages are received
136#
137# Default: true
138#new-message-bell=true
139
140#
141# Template to use for Account tab titles
142#
143# Default: {{.Account}}
144#tab-title-account={{.Account}}
145
146# Marker to show before a pinned tab's name.
147#
148# Default: `
149#pinned-tab-marker='`'
150
151# Template for the left side of the directory list.
152# See aerc-templates(7) for all available fields and functions.
153#
154# Default: {{.Folder}}
155#dirlist-left={{.Folder}}
156
157# Template for the right side of the directory list.
158# See aerc-templates(7) for all available fields and functions.
159#
160# Default: {{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
161#dirlist-right={{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
162
163# Delay after which the messages are actually listed when entering a directory.
164# This avoids loading messages when skipping over folders and makes the UI more
165# responsive. If you do not want that, set it to 0s.
166#
167# Default: 200ms
168#dirlist-delay=200ms
169
170# Display the directory list as a foldable tree that allows to collapse and
171# expand the folders.
172#
173# Default: false
174#dirlist-tree=false
175
176# If dirlist-tree is enabled, set level at which folders are collapsed by
177# default. Set to 0 to disable.
178#
179# Default: 0
180#dirlist-collapse=0
181
182# List of space-separated criteria to sort the messages by, see *sort*
183# command in *aerc*(1) for reference. Prefixing a criterion with "-r "
184# reverses that criterion.
185#
186# Example: "from -r date"
187#
188#sort=
189
190# Moves to next message when the current message is deleted
191#
192# Default: true
193#next-message-on-delete=true
194
195# Automatically set the "seen" flag when a message is opened in the message
196# viewer.
197#
198# Default: true
199#auto-mark-read=true
200
201# The directories where the stylesets are stored. It takes a colon-separated
202# list of directories. If this is unset or if a styleset cannot be found, the
203# following paths will be used as a fallback in that order:
204#
205# ${XDG_CONFIG_HOME:-~/.config}/aerc/stylesets
206# ${XDG_DATA_HOME:-~/.local/share}/aerc/stylesets
207# /usr/local/share/aerc/stylesets
208# /usr/share/aerc/stylesets
209#
210#stylesets-dirs=
211
212# Uncomment to use box-drawing characters for vertical and horizontal borders.
213#
214# Default: " "
215#border-char-vertical=" "
216#border-char-horizontal=" "
217
218# Sets the styleset to use for the aerc ui elements.
219#
220# Default: default
221#styleset-name=default
222
223# Activates fuzzy search in commands and their arguments: the typed string is
224# searched in the command or option in any position, and need not be
225# consecutive characters in the command or option.
226#
227# Default: false
228#fuzzy-complete=false
229
230# How long to wait after the last input before auto-completion is triggered.
231#
232# Default: 250ms
233#completion-delay=250ms
234
235# The minimum required characters to allow auto-completion to be triggered after
236# completion-delay.
237#
238# Default: 1
239#completion-min-chars=1
240
241#
242# Global switch for completion popovers
243#
244# Default: true
245#completion-popovers=true
246
247# Uncomment to use UTF-8 symbols to indicate PGP status of messages
248#
249# Default: ASCII
250#icon-unencrypted=
251#icon-encrypted=✔
252#icon-signed=✔
253#icon-signed-encrypted=✔
254#icon-unknown=✘
255#icon-invalid=âš 
256
257# Reverses the order of the message list. By default, the message list is
258# ordered with the newest (highest UID) message on top. Reversing the order
259# will put the oldest (lowest UID) message on top. This can be useful in cases
260# where the backend does not support sorting.
261#
262# Default: false
263#reverse-msglist-order = false
264
265# Reverse display of the mesage threads. Default order is the the intial
266# message is on the top with all the replies being displayed below. The
267# reverse option will put the initial message at the bottom with the
268# replies on top.
269#
270# Default: false
271#reverse-thread-order=false
272
273# Sort the thread siblings according to the sort criteria for the messages. If
274# sort-thread-siblings is false, the thread siblings will be sorted based on
275# the message UID in ascending order. This option is only applicable for
276# client-side threading with a backend that enables sorting. Note that there's
277# a performance impact when sorting is activated.
278#
279# Default: false
280#sort-thread-siblings=false
281
282#[ui:account=Personal]
283#
284# Enable a threaded view of messages. If this is not supported by the backend
285# (IMAP server or notmuch), threads will be built by the client.
286#
287# Default: false
288threading-enabled=true
289
290# Force client-side thread building
291#
292# Default: false
293#force-client-threads=false
294
295# Debounce client-side thread building
296#
297# Default: 50ms
298#client-threads-delay=50ms
299
300[statusline]
301#
302# Describes the format for the status line. This is a comma separated list of
303# column names with an optional align and width suffix. See [ui].index-columns
304# for more details. To completely mute the status line except for push
305# notifications, explicitly set status-columns to an empty string.
306#
307# Default: left<*,center:=,right>*
308#status-columns=left<*,center:=,right>*
309
310#
311# Each name in status-columns must have a corresponding column-$name setting.
312# All column-$name settings accept golang text/template syntax. See
313# aerc-templates(7) for available template attributes and functions.
314#
315# Default settings
316#column-left=[{{.Account}}] {{.StatusInfo}}
317#column-center={{.PendingKeys}}
318#column-right={{.TrayInfo}}
319
320#
321# String separator inserted between columns.
322# See [ui].column-separator for more details.
323#
324#column-separator=" "
325
326# Specifies the separator between grouped statusline elements.
327#
328# Default: " | "
329#separator=" | "
330
331# Defines the mode for displaying the status elements.
332# Options: text, icon
333#
334# Default: text
335#display-mode=text
336
337[viewer]
338#
339# Specifies the pager to use when displaying emails. Note that some filters
340# may add ANSI codes to add color to rendered emails, so you may want to use a
341# pager which supports ANSI codes.
342#
343# Default: less -R
344#pager=less -R
345
346#
347# If an email offers several versions (multipart), you can configure which
348# mimetype to prefer. For example, this can be used to prefer plaintext over
349# html emails.
350#
351# Default: text/plain,text/html
352#alternatives=text/plain,text/html
353
354#
355# Default setting to determine whether to show full headers or only parsed
356# ones in message viewer.
357#
358# Default: false
359#show-headers=false
360
361#
362# Layout of headers when viewing a message. To display multiple headers in the
363# same row, separate them with a pipe, e.g. "From|To". Rows will be hidden if
364# none of their specified headers are present in the message.
365#
366# Default: From|To,Cc|Bcc,Date,Subject
367#header-layout=From|To,Cc|Bcc,Date,Subject
368
369# Whether to always show the mimetype of an email, even when it is just a single part
370#
371# Default: false
372#always-show-mime=false
373
374# Parses and extracts http links when viewing a message. Links can then be
375# accessed with the open-link command.
376#
377# Default: true
378#parse-http-links=true
379
380[compose]
381#
382# Specifies the command to run the editor with. It will be shown in an embedded
383# terminal, though it may also launch a graphical window if the environment
384# supports it. Defaults to $EDITOR, or vi.
385#editor=
386
387# Address book command
388address-book-cmd = sh -c 'abook --mutt-query "%s" | tail -n +2'
389
390#
391# Default header fields to display when composing a message. To display
392# multiple headers in the same row, separate them with a pipe, e.g. "To|From".
393#
394# Default: To|From,Subject
395#header-layout=To|From,Subject
396
397#
398# Specifies the command to be used to tab-complete email addresses. Any
399# occurrence of "%s" in the address-book-cmd will be replaced with what the
400# user has typed so far.
401#
402# The command must output the completions to standard output, one completion
403# per line. Each line must be tab-delimited, with an email address occurring as
404# the first field. Only the email address field is required. The second field,
405# if present, will be treated as the contact name. Additional fields are
406# ignored.
407#
408# This parameter can also be set per account in accounts.conf.
409#address-book-cmd=
410
411# Specifies the command to be used to select attachments. Any occurence of '%s'
412# in the file-picker-cmd will be replaced the argument <arg> to :attach -m
413# <arg>.
414#
415# The command must output the selected files to standard output, one file per
416# line.
417file-picker-cmd=fzf --multi --query=%s
418
419#
420# Allow to address yourself when replying
421#
422# Default: true
423#reply-to-self=true
424
425#
426# Warn before sending an email that matches the specified regexp but does not
427# have any attachments. Leave empty to disable this feature.
428#
429# Uses Go's regexp syntax, documented at https://golang.org/s/re2syntax. The
430# "(?im)" flags are set by default (case-insensitive and multi-line).
431#
432# Example:
433# no-attachment-warning=^[^>]*attach(ed|ment)
434#
435#no-attachment-warning=
436
437#
438# When set, aerc will generate "format=flowed" bodies with a content type of
439# "text/plain; format=flowed" as described in RFC3676. This format is easier to
440# handle for some mailing software, and generally just looks like ordinary
441# text. To actually make use of this format's features, you'll need support in
442# your editor.
443#
444format-flowed=true
445
446[multipart-converters]
447#
448# Converters allow to generate multipart/alternative messages by converting the
449# main text/plain part into any other MIME type. Only exact MIME types are
450# accepted. The commands are invoked with sh -c and are expected to output
451# valid UTF-8 text.
452#
453# Example (obviously, this requires that you write your main text/plain body
454# using the markdown syntax):
455text/html=pandoc --wrap=preserve -f gfm+hard_line_breaks -t html --standalone
456
457[filters]
458#
459# Filters allow you to pipe an email body through a shell command to render
460# certain emails differently, e.g. highlighting them with ANSI escape codes.
461#
462# The commands are invoked with sh -c. The following folders are appended to
463# the system $PATH to allow referencing filters from their name only:
464#
465# ${XDG_CONFIG_HOME:-~/.config}/aerc/filters
466# ${XDG_DATA_HOME:-~/.local/share}/aerc/filters
467# $PREFIX/share/aerc/filters
468# /usr/share/aerc/filters
469#
470# The following variables are defined in the filter command environment:
471#
472# AERC_MIME_TYPE the part MIME type/subtype
473# AERC_FORMAT the part content type format= parameter
474# AERC_FILENAME the attachment filename (if any)
475# AERC_SUBJECT the message Subject header value
476# AERC_FROM the message From header value
477#
478# The first filter which matches the email's mimetype will be used, so order
479# them from most to least specific.
480#
481# You can also match on non-mimetypes, by prefixing with the header to match
482# against (non-case-sensitive) and a comma, e.g. subject,text will match a
483# subject which contains "text". Use header,~regex to match against a regex.
484#
485#text/plain=colorize
486#text/calendar=calendar
487message/delivery-status=bat -fn
488message/rfc822=bat -fn
489text/html=pandoc -f html -t plain | bat -fn
490#text/html=html | colorize
491text/*=bat -fn
492application/x-sh=bat -fn -l sh
493#image/*=catimg -w $(tput cols) -
494#subject,~Git(hub|lab)=lolcat -f
495#from,thatguywhodoesnothardwraphismessages=wrap -w 100 | colorize
496
497# This special filter is only used to post-process email headers when
498# [viewer].show-headers=true
499# By default, headers are piped directly into the pager.
500#
501#.headers=bat -fp
502
503[openers]
504#
505# Openers allow you to specify the command to use for the :open and :open-link
506# actions on a per-MIME-type basis. The :open-link URL scheme is used to
507# determine the MIME type as follows: x-scheme-handler/<scheme>.
508#
509# {} is expanded as the temporary filename to be opened. If it is not
510# encountered in the command, the temporary filename will be appened to the end
511# of the command.
512#
513# Like [filters], openers support basic shell globbing. The first opener which
514# matches the part's MIME type (or URL scheme handler MIME type) will be used,
515# so order them from most to least specific.
516#
517# Examples:
518# x-scheme-handler/irc=hexchat
519# x-scheme-handler/http*=firefox
520# text/html=surf -dfgms
521# text/plain=gvim {} +125
522# message/rfc822=thunderbird
523
524[hooks]
525#
526# Hooks are triggered whenever the associated event occurs.
527
528#
529# Executed when a new email arrives in the selected folder
530mail-received=notify-send "$AERC_FROM_NAME" "$AERC_SUBJECT"
531
532#
533# Executed when aerc starts
534#aerc-startup=aerc :terminal calcurse && aerc :next-tab
535
536#
537# Executed when aerc shuts down.
538#aerc-shutdown=
539
540[templates]
541# Templates are used to populate email bodies automatically.
542#
543
544# The directories where the templates are stored. It takes a colon-separated
545# list of directories. If this is unset or if a template cannot be found, the
546# following paths will be used as a fallback in that order:
547#
548# ${XDG_CONFIG_HOME:-~/.config}/aerc/templates
549# ${XDG_DATA_HOME:-~/.local/share}/aerc/templates
550# /usr/local/share/aerc/templates
551# /usr/share/aerc/templates
552#
553#template-dirs=
554
555# The default template to be used for new messages.
556#
557# default: new_message
558#new-message=new_message
559
560# The default template to be used for quoted replies.
561#
562# default: quoted_reply
563#quoted-reply=quoted_reply
564
565# The default template to be used for forward as body.
566#
567# default: forward_as_body
568#forwards=forward_as_body
569
diff --git a/users/ryan/aerc/binds.conf b/users/ryan/aerc/binds.conf
new file mode 100644
index 0000000..3c1e2d2
--- /dev/null
+++ b/users/ryan/aerc/binds.conf
@@ -0,0 +1,150 @@
1# Binds are of the form <key sequence> = <command to run>
2# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
3# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
4<C-p> = :prev-tab<Enter>
5<C-n> = :next-tab<Enter>
6<C-t> = :term<Enter>
7? = :help keys<Enter>
8
9[messages]
10q = :quit<Enter>
11
12j = :next<Enter>
13<Down> = :next<Enter>
14<C-d> = :next 50%<Enter>
15<C-f> = :next 100%<Enter>
16<PgDn> = :next 100%<Enter>
17
18k = :prev<Enter>
19<Up> = :prev<Enter>
20<C-u> = :prev 50%<Enter>
21<C-b> = :prev 100%<Enter>
22<PgUp> = :prev 100%<Enter>
23g = :select 0<Enter>
24G = :select -1<Enter>
25<C-r> = :read<Enter>
26<C-u> = :unread<Enter>
27
28J = :next-folder<Enter>
29K = :prev-folder<Enter>
30H = :collapse-folder<Enter>
31L = :expand-folder<Enter>
32
33v = :mark -t<Enter>
34V = :mark -v<Enter>
35
36T = :toggle-threads<Enter>
37
38<Enter> = :view<Enter>
39dd = :mv Trash<Enter>
40dg = :mv [Gmail]/Trash<Enter>
41D = :delete<Enter>
42A = :archive year<Enter>
43
44C = :compose<Enter>
45
46rr = :reply -a<Enter>
47rq = :reply -aq<Enter>
48Rr = :reply<Enter>
49Rq = :reply -q<Enter>
50f = :forward -A<Enter>
51
52# Git custom stuff ala Drew Devault
53ga = :pipe -mb git am -3<Enter>
54gp = :term git push<Enter>
55rt = :reply -aTthanks<Enter>
56
57c = :cf<space>
58$ = :term<space>
59! = :term<space>
60| = :pipe<space>
61
62/ = :search<space>
63\ = :filter<space>
64n = :next-result<Enter>
65N = :prev-result<Enter>
66<Esc> = :clear<Enter>
67
68[messages:folder=Drafts]
69<Enter> = :recall<Enter>
70
71[view]
72/ = :toggle-key-passthrough<Enter>/
73q = :close<Enter>
74O = :open<Enter>
75S = :save<space>
76| = :pipe<space>
77D = :delete<Enter>
78dd = :mv Trash<Enter>
79dg = :mv [Gmail]/Trash<Enter>
80A = :archive year<Enter>
81
82<C-l> = :open-link <space>
83
84f = :forward -A<Enter>
85rr = :reply -a<Enter>
86rq = :reply -aq<Enter>
87Rr = :reply<Enter>
88Rq = :reply -q<Enter>
89
90H = :toggle-headers<Enter>
91<C-k> = :prev-part<Enter>
92<C-j> = :next-part<Enter>
93J = :next<Enter>
94K = :prev<Enter>
95
96[view::passthrough]
97$noinherit = true
98$ex = <C-x>
99<Esc> = :toggle-key-passthrough<Enter>
100
101[compose]
102# Keybindings used when the embedded terminal is not selected in the compose
103# view
104$noinherit = true
105$ex = <C-x>
106<C-k> = :prev-field<Enter>
107<C-j> = :next-field<Enter>
108<A-p> = :switch-account -p<Enter>
109<A-n> = :switch-account -n<Enter>
110<tab> = :next-field<Enter>
111<backtab> = :prev-field<Enter>
112<C-p> = :prev-tab<Enter>
113<C-n> = :next-tab<Enter>
114<C-c> = :cc<Enter>
115<C-b> = :bcc<Enter>
116<C-q> = :abort<Enter>
117
118[compose::editor]
119# Keybindings used when the embedded terminal is selected in the compose view
120$noinherit = true
121$ex = <C-x>
122<C-k> = :prev-field<Enter>
123<C-j> = :next-field<Enter>
124<C-p> = :prev-tab<Enter>
125<C-n> = :next-tab<Enter>
126<C-q> = :abort<Enter>
127
128[compose::review]
129# Keybindings used when reviewing a message to be sent
130y = :send<Enter>
131n = :abort<Enter>
132v = :preview<Enter>
133p = :postpone<Enter>
134q = :choose -o d discard abort -o p postpone postpone<Enter>
135e = :edit<Enter>
136a = :attach<space>
137d = :detach<space>
138S = :sign<Enter>
139E = :encrypt<Enter>
140A = :attach-key<Enter>
141C = :multipart text/html<Enter>
142
143[terminal]
144$noinherit = true
145$ex = <C-x>
146<C-q> = :close<Enter>
147
148<C-p> = :prev-tab<Enter>
149<C-n> = :next-tab<Enter>
150
diff --git a/users/ryan/aerc/signature_personal b/users/ryan/aerc/signature_personal
new file mode 100644
index 0000000..d287d98
--- /dev/null
+++ b/users/ryan/aerc/signature_personal
@@ -0,0 +1,4 @@
1--
2Best,
3Ryan Schanzenbacher
4
diff --git a/users/ryan/aerc/signature_rit_personal b/users/ryan/aerc/signature_rit_personal
new file mode 100644
index 0000000..e5e0b0a
--- /dev/null
+++ b/users/ryan/aerc/signature_rit_personal
@@ -0,0 +1,6 @@
1--
2Best,
3Ryan Schanzenbacher
4Rochester Institute of Technology
5Cybersecurity BS/MS Student
6
diff --git a/users/ryan/aerc/templates/quoted_reply b/users/ryan/aerc/templates/quoted_reply
new file mode 100644
index 0000000..28f9ee8
--- /dev/null
+++ b/users/ryan/aerc/templates/quoted_reply
@@ -0,0 +1,7 @@
1X-Mailer: aerc {{version}}
2
3{{.Signature}}
4
5On {{dateFormat (.OriginalDate | toLocal) "Mon Jan 2, 2006 at 3:04 PM MST"}}, {{(index .OriginalFrom 0).Name}} wrote:
6{{trimSignature .OriginalText | quote}}
7
diff --git a/users/ryan/home.nix b/users/ryan/home.nix
new file mode 100644
index 0000000..9154066
--- /dev/null
+++ b/users/ryan/home.nix
@@ -0,0 +1,126 @@
1{ config, pkgs, ... }:
2
3{
4 # This value determines the Home Manager release that your configuration is
5 # compatible with. This helps avoid breakage when a new Home Manager release
6 # introduces backwards incompatible changes.
7 #
8 # You should not change this value, even if you update Home Manager. If you do
9 # want to update the value, then make sure to first check the Home Manager
10 # release notes.
11 home.stateVersion = "26.05"; # Please read the comment before changing.
12
13 news.display = "silent";
14
15 programs.starship = {
16 enable = true;
17 settings = {
18 add_newline = false;
19 character = {
20 success_symbol = "[➜](bold green)";
21 error_symbol = "[➜](bold red)";
22 };
23 time = {
24 disabled = false;
25 format = "\[ $time \]($style)";
26 time_format = "%T";
27 };
28 };
29 };
30
31 programs.zen-browser = {
32 enable = true;
33 package = null; # managed via homebrew
34 darwinDefaultsId = "app.zen-browser.zen";
35 policies = import ./zen/zenPolicies.nix;
36 profiles.default = import ./zen/zenProfile.nix;
37 };
38
39 programs.eza = {
40 enable = true;
41 enableZshIntegration = true;
42 };
43
44 programs.gpg.enable = true;
45
46 programs.git = {
47 enable = true;
48 signing.signByDefault = true;
49 settings = {
50 user = {
51 name = "Ryan Schanzenbacher";
52 email = "ryan@rschanz.org";
53 };
54 core.pager = "${pkgs.delta}/bin/delta";
55 init.defaultBranch = "main";
56 merge.conflictStyle = "zdiff3";
57 interactive.diffFilter = "${pkgs.delta}/bin/delta --color-only";
58 delta = {
59 navigate = true;
60 side-by-side = true;
61 };
62 };
63 };
64
65 services.gpg-agent = {
66 enable = true;
67 enableSshSupport = true;
68 };
69
70 programs.zsh = {
71 enable = true;
72 initContent = ''
73 export GPG_TTY="$(tty)"
74 export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
75 gpgconf --launch gpg-agent
76 gpg-connect-agent updatestartuptty /bye > /dev/null
77 '';
78 shellAliases = {
79 cat = "bat --paging=never";
80 diff = "delta";
81 };
82 };
83
84 # The home.packages option allows you to install Nix packages into your
85 # environment.
86 home.packages = with pkgs; [
87 neovim
88 git
89 yt-dlp
90 aerc
91 gdu
92 mpv
93 taskwarrior3
94 delta
95 bat
96 pass
97 pandoc
98 ];
99
100 # Home Manager is pretty good at managing dotfiles. The primary way to manage
101 # plain files is through 'home.file'.
102 home.file = {
103 # # Building this configuration will create a copy of 'dotfiles/screenrc' in
104 # # the Nix store. Activating the configuration will then make '~/.screenrc' a
105 # # symlink to the Nix store copy.
106 # ".screenrc".source = dotfiles/screenrc;
107
108 # # You can also set the file content immediately.
109 # ".gradle/gradle.properties".text = ''
110 # org.gradle.console=verbose
111 # org.gradle.daemon.idletimeout=3600000
112 # '';
113 };
114
115 xdg.configFile."aerc" = {
116 source = ./aerc;
117 recursive = true;
118 };
119
120 home.sessionVariables = {
121 XDG_CONFIG_HOME = "${config.home.homeDirectory}/.config";
122 };
123
124 # Let Home Manager install and manage itself.
125 programs.home-manager.enable = true;
126}
diff --git a/users/ryan/zen/zenPolicies.nix b/users/ryan/zen/zenPolicies.nix
new file mode 100644
index 0000000..edde27d
--- /dev/null
+++ b/users/ryan/zen/zenPolicies.nix
@@ -0,0 +1,125 @@
1let
2 lock-false = {
3 Value = false;
4 Status = "locked";
5 };
6 lock-true = {
7 Value = true;
8 Status = "locked";
9 };
10in
11{
12 EnableTrackingProtection = {
13 Value = true;
14 Locked = true;
15 Cryptomining = true;
16 Fingerprinting = true;
17 EmailTracking = true;
18 };
19 UserMessaging = {
20 WhatsNew = false;
21 ExtensionRecommendations = false;
22 FeatureRecommendations = false;
23 UrlbarInterventions = false;
24 SkipOnboarding = true;
25 MoreFromMozilla = false;
26 Labs = false;
27 Locked = true;
28 };
29 DisableAppUpdate = true;
30 DisableAccounts = true;
31 DisableFirefoxAccounts = true;
32 DisableFirefoxStudies = true;
33 DisablePocket = true;
34 DisableTelemetry = true;
35 AutofillAddressEnabled = false;
36 AutofillCreditCardEnabled = false;
37 DisableMasterPasswordCreation = true;
38 PasswordManagerEnabled = false;
39 PrimaryPassword = false;
40 OfferToSaveLogins = false;
41 NoDefaultBookmarks = true;
42 OverrideFirstRunPage = "";
43 OverridePostUpdatePage = "";
44 FirefoxHome = {
45 Search = true;
46 TopSites = true;
47 SponsoredTopSites = false;
48 Highlights = false;
49 Pocket = false;
50 SponsoredPocket = false;
51 Snippets = false;
52 Locked = true;
53 };
54 SearchSuggestEnabled = true;
55 FirefoxSuggest = {
56 WebSuggestions = true;
57 SponsoredSuggestions = false;
58 ImproveSuggest = false;
59 Locked = true;
60 };
61 PictureInPicture = lock-true;
62 HardwareAcceleration = true;
63 Certificates = {
64 ImportEnterpriseRoots = true;
65 };
66 ExtensionSettings = {
67 #"*".installation_mode = "blocked";
68 # uBlock Origin
69 "uBlock0@raymondhill.net" = {
70 install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
71 installation_mode = "force_installed";
72 };
73 # Bitwarden
74 "{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
75 install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi";
76 installation_mode = "normal_installed";
77 };
78 # SponsorBlock
79 "sponsorBlocker@ajay.app" = {
80 install_url = "https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi";
81 installation_mode = "force_installed";
82 };
83 # DeArrow
84 "deArrow@ajay.app" = {
85 install_url = "https://addons.mozilla.org/firefox/downloads/latest/dearrow/latest.xpi";
86 installation_mode = "force_installed";
87 };
88 # Return Youtube Dislike
89 "{762f9885-5a13-4abd-9c77-433dcd38b8fd}" = {
90 install_url = "https://addons.mozilla.org/firefox/downloads/latest/return-youtube-dislikes/latest.xpi";
91 installation_mode = "force_installed";
92 };
93 # Youtube Nonstop
94 "{0d7cafdd-501c-49ca-8ebb-e3341caaa55e}" = {
95 install_url = "https://addons.mozilla.org/firefox/downloads/latest/youtube-nonstop/latest.xpi";
96 installation_mode = "force_installed";
97 };
98 # TamperMonkey
99 "firefox@tampermonkey.net" = {
100 install_url = "https://addons.mozilla.org/firefox/downloads/latest/tampermonkey/latest.xpi";
101 installation_mode = "force_installed";
102 };
103 # Floccus
104 "floccus@handmadeideas.org" = {
105 install_url = "https://addons.mozilla.org/firefox/downloads/latest/floccus/latest.xpi";
106 installation_mode = "force_installed";
107 };
108 # Mailvelope
109 "jid1-AQqSMBYb0a8ADg@jetpack" = {
110 install_url = "https://addons.mozilla.org/firefox/downloads/latest/mailvelope/latest.xpi";
111 installation_mode = "force_installed";
112 };
113 };
114 Preferences = {
115 "xpinstall.whitelist.required" = lock-true;
116 "dom.webgpu.enabled" = lock-true;
117 "media.eme.enabled" = lock-true;
118 "general.autoScroll" = lock-true;
119 "general.smoothScroll" = lock-true;
120 "browser.crashReports.unsubmittedCheck.autoSubmit2" = lock-false;
121 "browser.aboutConfig.showWarning" = lock-false;
122 "media.videocontrols.picture-in-picture.enable-when-switching-tabs.enabled" = lock-true;
123 };
124}
125
diff --git a/users/ryan/zen/zenProfile.nix b/users/ryan/zen/zenProfile.nix
new file mode 100644
index 0000000..d77a906
--- /dev/null
+++ b/users/ryan/zen/zenProfile.nix
@@ -0,0 +1,71 @@
1rec {
2 settings = {
3 "zen.welcome-screen.seen" = true;
4 "zen.urlbar.behavior" = "float";
5 "zen.view.compact.enable-at-startup"= true;
6 "zen.view.use-single-toolbar"= false;
7 "zen.view.window.scheme"= 0;
8 };
9
10 pinsForce = true;
11 pins = {
12 "Discord" = {
13 id = "59d28a80-d185-4dec-92cb-6da549cdfd27";
14 workspace = spaces."Personal".id;
15 url = "https://discord.com/channels/@me";
16 position = 101;
17 isEssential = true;
18 };
19 "RSS" = {
20 id = "0fa25825-01f2-49ce-b8a2-80f1100e782c";
21 workspace = spaces."Personal".id;
22 url = "https://rss.ryan77627.xyz";
23 position = 102;
24 isEssential = true;
25 };
26 };
27
28 spacesForce = true;
29 spaces = {
30 "Personal" = {
31 id = "2392f396-2548-4a20-9fb8-a3e940be4a58";
32 #icon = "";
33 position = 1000;
34 theme = {
35 type = "gradient";
36 colors = [
37 {
38 red = 199;
39 green = 161;
40 blue = 247;
41 algorithm = "complementary";
42 type = "explicit-lightness";
43 lightness = 80;
44 #isPrimary = true;
45 }
46 # {
47 # red = 157;
48 # green = 251;
49 # blue = 194;
50 # algorithm = "splitComplimentary";
51 # type = "explicit-lightness";
52 # lightness = 80;
53 # isPrimary = false;
54 # }
55 # {
56 # red = 161;
57 # green = 243;
58 # blue = 247;
59 # algorithm = "splitComplimentary";
60 # type = "explicit-lightness";
61 # lightness = 80;
62 # isPrimary = false;
63 # }
64 ];
65 opacity = 0.419;
66 texture = 0.3125;
67 };
68 };
69 };
70}
71