+10
.luarc.json
+10
.luarc.json
+13
.sops.yaml
+13
.sops.yaml
···
1
+
keys:
2
+
- &diogo ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICCTbCHJ0avif6MQ7izXlHHaubNsOhU2xf9lMvXKLyUQ
3
+
4
+
creation_rules:
5
+
- path_regex: ^secrets/diogo\.yaml$
6
+
key_groups:
7
+
- age:
8
+
- *diogo
9
+
10
+
- path_regex: ^secrets/services/[^/]+\.yaml$
11
+
key_groups:
12
+
- age:
13
+
- *diogo
+19
LICENSE
+19
LICENSE
···
1
+
zlib License
2
+
3
+
(C) 2025 Diogo (https://bsky.app/profile/diogo.fi)
4
+
5
+
This software is provided 'as-is', without any express or implied
6
+
warranty. In no event will the authors be held liable for any damages
7
+
arising from the use of this software.
8
+
9
+
Permission is granted to anyone to use this software for any purpose,
10
+
including commercial applications, and to alter it and redistribute it
11
+
freely, subject to the following restrictions:
12
+
13
+
1. The origin of this software must not be misrepresented; you must not
14
+
claim that you wrote the original software. If you use this software
15
+
in a product, an acknowledgment in the product documentation would be
16
+
appreciated but is not required.
17
+
2. Altered source versions must be plainly marked as such, and must not be
18
+
misrepresented as being the original software.
19
+
3. This notice may not be removed or altered from any source distribution.
+6
README.md
+6
README.md
···
1
+
# diogo's dotfiles
2
+
3
+
> [!WARNING]
4
+
> This is _highly_ opinionated and tailored for my own needs. I wouldn't recommend using this as-is on your machine unless you love debugging at 3 AM. Proceed with caution _(and maybe a backup)_.
5
+
6
+
This is where I keep all my config, secrets, and sanity. It's **heavily** inspired by [isabelroses/dotfiles](https://github.com/isabelroses/dotfiles) _(go follow her, she's a legend)_, but with my own chaotic energy sprinkled on top.
+240
flake.lock
+240
flake.lock
···
1
+
{
2
+
"nodes": {
3
+
"brew-src": {
4
+
"flake": false,
5
+
"locked": {
6
+
"lastModified": 1761551821,
7
+
"narHash": "sha256-N3Zj73TAxclhLGgADbPVwcVrhYIBKUgAxjfQuOXre6s=",
8
+
"owner": "Homebrew",
9
+
"repo": "brew",
10
+
"rev": "8f6719274133c5bcc24c058c5a6bcbb3b0cd48b3",
11
+
"type": "github"
12
+
},
13
+
"original": {
14
+
"owner": "Homebrew",
15
+
"ref": "4.6.19",
16
+
"repo": "brew",
17
+
"type": "github"
18
+
}
19
+
},
20
+
"catppuccin": {
21
+
"inputs": {
22
+
"nixpkgs": [
23
+
"nixpkgs"
24
+
]
25
+
},
26
+
"locked": {
27
+
"lastModified": 1763110997,
28
+
"narHash": "sha256-S2vF+3D/9vna3/vBV7LHiGUbp+ltPsQhvccIyim6VQg=",
29
+
"owner": "catppuccin",
30
+
"repo": "nix",
31
+
"rev": "e6928cdd3dd20636326c2756d2bc8fd1cd825768",
32
+
"type": "github"
33
+
},
34
+
"original": {
35
+
"owner": "catppuccin",
36
+
"repo": "nix",
37
+
"type": "github"
38
+
}
39
+
},
40
+
"darwin": {
41
+
"inputs": {
42
+
"nixpkgs": [
43
+
"nixpkgs"
44
+
]
45
+
},
46
+
"locked": {
47
+
"lastModified": 1763505477,
48
+
"narHash": "sha256-nJRd4LY2kT3OELfHqdgWjvToNZ4w+zKCMzS2R6z4sXE=",
49
+
"owner": "nix-darwin",
50
+
"repo": "nix-darwin",
51
+
"rev": "3bda9f6b14161becbd07b3c56411f1670e19b9b5",
52
+
"type": "github"
53
+
},
54
+
"original": {
55
+
"owner": "nix-darwin",
56
+
"repo": "nix-darwin",
57
+
"type": "github"
58
+
}
59
+
},
60
+
"easy-hosts": {
61
+
"locked": {
62
+
"lastModified": 1755470564,
63
+
"narHash": "sha256-KB1ZryVDoQcbIsItOf4WtxkHhh3ppj+XwMpSnt/2QHc=",
64
+
"owner": "tgirlcloud",
65
+
"repo": "easy-hosts",
66
+
"rev": "d0422bc7b3db26268982aa15d07e60370e76ee1d",
67
+
"type": "github"
68
+
},
69
+
"original": {
70
+
"owner": "tgirlcloud",
71
+
"repo": "easy-hosts",
72
+
"type": "github"
73
+
}
74
+
},
75
+
"flake-parts": {
76
+
"inputs": {
77
+
"nixpkgs-lib": [
78
+
"nixpkgs"
79
+
]
80
+
},
81
+
"locked": {
82
+
"lastModified": 1762980239,
83
+
"narHash": "sha256-8oNVE8TrD19ulHinjaqONf9QWCKK+w4url56cdStMpM=",
84
+
"owner": "hercules-ci",
85
+
"repo": "flake-parts",
86
+
"rev": "52a2caecc898d0b46b2b905f058ccc5081f842da",
87
+
"type": "github"
88
+
},
89
+
"original": {
90
+
"owner": "hercules-ci",
91
+
"repo": "flake-parts",
92
+
"type": "github"
93
+
}
94
+
},
95
+
"home-manager": {
96
+
"inputs": {
97
+
"nixpkgs": [
98
+
"nixpkgs"
99
+
]
100
+
},
101
+
"locked": {
102
+
"lastModified": 1763416652,
103
+
"narHash": "sha256-8EBEEvtzQ11LCxpQHMNEBQAGtQiCu/pqP9zSovDSbNM=",
104
+
"owner": "nix-community",
105
+
"repo": "home-manager",
106
+
"rev": "ea164b7c9ccdc2321379c2ff78fd4317b4c41312",
107
+
"type": "github"
108
+
},
109
+
"original": {
110
+
"owner": "nix-community",
111
+
"repo": "home-manager",
112
+
"type": "github"
113
+
}
114
+
},
115
+
"home-manager_2": {
116
+
"inputs": {
117
+
"nixpkgs": [
118
+
"zen-browser",
119
+
"nixpkgs"
120
+
]
121
+
},
122
+
"locked": {
123
+
"lastModified": 1762964643,
124
+
"narHash": "sha256-RYHN8O/Aja59XDji6WSJZPkJpYVUfpSkyH+PEupBJqM=",
125
+
"owner": "nix-community",
126
+
"repo": "home-manager",
127
+
"rev": "827f2a23373a774a8805f84ca5344654c31f354b",
128
+
"type": "github"
129
+
},
130
+
"original": {
131
+
"owner": "nix-community",
132
+
"repo": "home-manager",
133
+
"type": "github"
134
+
}
135
+
},
136
+
"homebrew": {
137
+
"inputs": {
138
+
"brew-src": "brew-src"
139
+
},
140
+
"locked": {
141
+
"lastModified": 1761927470,
142
+
"narHash": "sha256-KsFDGRGD8j1R6TvJ4HkebKsh3HXLY0XazanLrhO3wqE=",
143
+
"owner": "zhaofengli",
144
+
"repo": "nix-homebrew",
145
+
"rev": "3cae36b3a17b09a66435291619dce8cf2c4728ca",
146
+
"type": "github"
147
+
},
148
+
"original": {
149
+
"owner": "zhaofengli",
150
+
"repo": "nix-homebrew",
151
+
"type": "github"
152
+
}
153
+
},
154
+
"nixpkgs": {
155
+
"locked": {
156
+
"lastModified": 1763464769,
157
+
"narHash": "sha256-mU85VDFRIgKGq1EhT71bLjhvjJ5yuMEe0Ip1kwCbR80=",
158
+
"rev": "6f374686605df381de8541c072038472a5ea2e2d",
159
+
"type": "tarball",
160
+
"url": "https://releases.nixos.org/nixpkgs/nixpkgs-25.11pre898015.6f374686605d/nixexprs.tar.xz"
161
+
},
162
+
"original": {
163
+
"type": "tarball",
164
+
"url": "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz"
165
+
}
166
+
},
167
+
"root": {
168
+
"inputs": {
169
+
"catppuccin": "catppuccin",
170
+
"darwin": "darwin",
171
+
"easy-hosts": "easy-hosts",
172
+
"flake-parts": "flake-parts",
173
+
"home-manager": "home-manager",
174
+
"homebrew": "homebrew",
175
+
"nixpkgs": "nixpkgs",
176
+
"sops": "sops",
177
+
"systems": "systems",
178
+
"zen-browser": "zen-browser"
179
+
}
180
+
},
181
+
"sops": {
182
+
"inputs": {
183
+
"nixpkgs": [
184
+
"nixpkgs"
185
+
]
186
+
},
187
+
"locked": {
188
+
"lastModified": 1763509310,
189
+
"narHash": "sha256-s2WzTAD3vJtPACBCZXezNUMTG/wC6SFsU9DxazB9wDI=",
190
+
"owner": "Mic92",
191
+
"repo": "sops-nix",
192
+
"rev": "3ee33c0ed7c5aa61b4e10484d2ebdbdc98afb03e",
193
+
"type": "github"
194
+
},
195
+
"original": {
196
+
"owner": "Mic92",
197
+
"repo": "sops-nix",
198
+
"type": "github"
199
+
}
200
+
},
201
+
"systems": {
202
+
"locked": {
203
+
"lastModified": 1681028828,
204
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
205
+
"owner": "nix-systems",
206
+
"repo": "default",
207
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
208
+
"type": "github"
209
+
},
210
+
"original": {
211
+
"owner": "nix-systems",
212
+
"repo": "default",
213
+
"type": "github"
214
+
}
215
+
},
216
+
"zen-browser": {
217
+
"inputs": {
218
+
"home-manager": "home-manager_2",
219
+
"nixpkgs": [
220
+
"nixpkgs"
221
+
]
222
+
},
223
+
"locked": {
224
+
"lastModified": 1763521945,
225
+
"narHash": "sha256-Zcrafbe4niRJMbzaVOwg7+iedJhwBFttre2DpyCC6qA=",
226
+
"owner": "0xc000022070",
227
+
"repo": "zen-browser-flake",
228
+
"rev": "24d7381b9231c23daceec5d372cc28e877f7785d",
229
+
"type": "github"
230
+
},
231
+
"original": {
232
+
"owner": "0xc000022070",
233
+
"repo": "zen-browser-flake",
234
+
"type": "github"
235
+
}
236
+
}
237
+
},
238
+
"root": "root",
239
+
"version": 7
240
+
}
+75
flake.nix
+75
flake.nix
···
1
+
{
2
+
description = "diogo's dotfiles";
3
+
4
+
inputs = {
5
+
nixpkgs.url = "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz";
6
+
7
+
darwin = {
8
+
type = "github";
9
+
owner = "nix-darwin";
10
+
repo = "nix-darwin";
11
+
inputs.nixpkgs.follows = "nixpkgs";
12
+
};
13
+
14
+
home-manager = {
15
+
type = "github";
16
+
owner = "nix-community";
17
+
repo = "home-manager";
18
+
inputs.nixpkgs.follows = "nixpkgs";
19
+
};
20
+
21
+
catppuccin = {
22
+
type = "github";
23
+
owner = "catppuccin";
24
+
repo = "nix";
25
+
inputs.nixpkgs.follows = "nixpkgs";
26
+
};
27
+
28
+
homebrew = {
29
+
type = "github";
30
+
owner = "zhaofengli";
31
+
repo = "nix-homebrew";
32
+
};
33
+
34
+
flake-parts = {
35
+
type = "github";
36
+
owner = "hercules-ci";
37
+
repo = "flake-parts";
38
+
inputs.nixpkgs-lib.follows = "nixpkgs";
39
+
};
40
+
41
+
easy-hosts = {
42
+
type = "github";
43
+
owner = "tgirlcloud";
44
+
repo = "easy-hosts";
45
+
};
46
+
47
+
systems = {
48
+
type = "github";
49
+
owner = "nix-systems";
50
+
repo = "default";
51
+
};
52
+
53
+
sops = {
54
+
type = "github";
55
+
owner = "Mic92";
56
+
repo = "sops-nix";
57
+
inputs.nixpkgs.follows = "nixpkgs";
58
+
};
59
+
60
+
zen-browser = {
61
+
type = "github";
62
+
owner = "0xc000022070";
63
+
repo = "zen-browser-flake";
64
+
inputs.nixpkgs.follows = "nixpkgs";
65
+
};
66
+
};
67
+
68
+
outputs =
69
+
inputs:
70
+
inputs.flake-parts.lib.mkFlake { inherit inputs; } {
71
+
imports = [
72
+
./flake
73
+
];
74
+
};
75
+
}
+12
flake/args.nix
+12
flake/args.nix
+8
flake/default.nix
+8
flake/default.nix
+43
flake/formatter.nix
+43
flake/formatter.nix
···
1
+
{
2
+
perSystem =
3
+
{ pkgs, config, ... }:
4
+
{
5
+
formatter = pkgs.treefmt.withConfig {
6
+
runtimeInputs = with pkgs; [
7
+
nixfmt
8
+
shfmt
9
+
stylua
10
+
];
11
+
12
+
settings = {
13
+
on-unmatched = "info";
14
+
tree-root-file = "flake.nix";
15
+
16
+
formatter = {
17
+
nixfmt = {
18
+
command = "nixfmt";
19
+
includes = [ "*.nix" ];
20
+
};
21
+
22
+
shfmt = {
23
+
command = "shfmt";
24
+
options = [
25
+
"-s"
26
+
"-w"
27
+
"-i"
28
+
"2"
29
+
];
30
+
includes = [
31
+
"*.sh"
32
+
];
33
+
};
34
+
35
+
stylua = {
36
+
command = "stylua";
37
+
includes = [ "*.lua" ];
38
+
};
39
+
};
40
+
};
41
+
};
42
+
};
43
+
}
+12
flake/lib/default.nix
+12
flake/lib/default.nix
···
1
+
# original: https://github.com/isabelroses/dotfiles/blob/main/modules/flake/lib/default.nix
2
+
{ lib, ... }:
3
+
let
4
+
sysLib = lib.fixedPoints.makeExtensible (final: {
5
+
services = import ./services.nix { inherit lib; };
6
+
7
+
inherit (final.services) mkServiceOption;
8
+
});
9
+
in
10
+
{
11
+
flake.lib = sysLib;
12
+
}
+41
flake/lib/services.nix
+41
flake/lib/services.nix
···
1
+
# original: https://github.com/isabelroses/dotfiles/blob/main/modules/flake/lib/services.nix
2
+
{ lib, ... }:
3
+
let
4
+
inherit (lib.types) str;
5
+
inherit (lib.options) mkOption mkEnableOption;
6
+
7
+
mkServiceOption =
8
+
name:
9
+
{
10
+
port ? 0,
11
+
host ? "127.0.0.1",
12
+
domain ? "",
13
+
extraConfig ? { },
14
+
}:
15
+
{
16
+
enable = mkEnableOption "Enable the ${name} service";
17
+
18
+
host = mkOption {
19
+
type = str;
20
+
default = host;
21
+
description = "Host where the ${name} service will run on";
22
+
};
23
+
24
+
port = mkOption {
25
+
type = lib.types.port;
26
+
default = port;
27
+
description = "Port where the ${name} service will run on";
28
+
};
29
+
30
+
domain = mkOption {
31
+
type = str;
32
+
default = domain;
33
+
defaultText = "networking.domain";
34
+
description = "Domain for the ${name} service";
35
+
};
36
+
}
37
+
// extraConfig;
38
+
in
39
+
{
40
+
inherit mkServiceOption;
41
+
}
+31
home/default.nix
+31
home/default.nix
···
1
+
{
2
+
lib,
3
+
config,
4
+
self,
5
+
self',
6
+
inputs,
7
+
inputs',
8
+
...
9
+
}:
10
+
{
11
+
home-manager = {
12
+
useUserPackages = true;
13
+
useGlobalPkgs = true;
14
+
backupFileExtension = "bak";
15
+
16
+
extraSpecialArgs = {
17
+
inherit
18
+
self
19
+
self'
20
+
inputs
21
+
inputs'
22
+
;
23
+
};
24
+
25
+
users = lib.genAttrs config.sys.users (name: {
26
+
imports = [ ./${name} ];
27
+
});
28
+
29
+
sharedModules = [ (self + /modules/home/default.nix) ];
30
+
};
31
+
}
+11
home/diogo/catppuccin.nix
+11
home/diogo/catppuccin.nix
+9
home/diogo/default.nix
+9
home/diogo/default.nix
+10
home/diogo/programs/btop.nix
+10
home/diogo/programs/btop.nix
+31
home/diogo/programs/default.nix
+31
home/diogo/programs/default.nix
···
1
+
{ pkgs, ... }:
2
+
{
3
+
imports = [
4
+
./git.nix
5
+
./fastfetch
6
+
./zsh.nix
7
+
./ohmyposh
8
+
./btop.nix
9
+
./neovim
10
+
./tmux.nix
11
+
./zen.nix
12
+
./fzf.nix
13
+
./ripgrep.nix
14
+
./vesktop.nix
15
+
./zed.nix
16
+
./ghostty.nix
17
+
];
18
+
19
+
sys.packages = {
20
+
inherit (pkgs)
21
+
nodejs
22
+
just
23
+
bun
24
+
age
25
+
sops
26
+
go
27
+
rustc
28
+
cargo
29
+
;
30
+
};
31
+
}
+6
home/diogo/programs/fastfetch/default.nix
+6
home/diogo/programs/fastfetch/default.nix
+106
home/diogo/programs/fastfetch/fasfetch.jsonc
+106
home/diogo/programs/fastfetch/fasfetch.jsonc
···
1
+
{
2
+
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
3
+
"display": {
4
+
"separator": "",
5
+
"constants": [
6
+
"\u001b[90m│ │\u001b[60D\u001b[39m"
7
+
]
8
+
},
9
+
"modules": [
10
+
{
11
+
"type": "custom",
12
+
"key": "{#90}╭ Keys ───────╮",
13
+
"format": "{#90}╭ Values ────────────────────────────────────────────────────╮"
14
+
},
15
+
{
16
+
"type": "title",
17
+
"key": "{#90}│ {#92}User {#90}│",
18
+
"format": "{$1}{user-name} {#2}[{home-dir}]"
19
+
},
20
+
{
21
+
"type": "title",
22
+
"key": "{#90}│ {#93}Hostname {#90}│",
23
+
"format": "{$1}{host-name}"
24
+
},
25
+
{
26
+
"type": "os",
27
+
"key": "{#90}│ {#93}OS {#90}│",
28
+
"format": "{$1}{?pretty-name}{pretty-name}{?}{/pretty-name}{name}{/} {codename} {#2}[v{version}] [{arch}]"
29
+
},
30
+
{
31
+
"type": "kernel",
32
+
"key": "{#90}│ {#93}Kernel {#90}│",
33
+
"format": "{$1}{sysname} {#2}[v{release}]"
34
+
},
35
+
{
36
+
"type": "packages",
37
+
"key": "{#90}│ {#93}Packages {#90}│",
38
+
"format": "{$1}{all} {#2}[all]"
39
+
},
40
+
{
41
+
"type": "uptime",
42
+
"key": "{#90}│ {#93}Uptime {#90}│",
43
+
"format": "{$1}{?days}{days}d + {?}{hours}h {minutes}m {seconds}s"
44
+
},
45
+
{
46
+
"type": "cpu",
47
+
"key": "{#90}│ {#91}CPU {#90}│",
48
+
"showPeCoreCount": true,
49
+
"temp": true,
50
+
"format": "{$1}{name} {#2}[C:{core-types}] [{freq-max}]"
51
+
},
52
+
{
53
+
"type": "memory",
54
+
"key": "{#90}│ {#91}Memory {#90}│",
55
+
"format": "{$1}{used} / {total} ({percentage})"
56
+
},
57
+
{
58
+
"type": "disk",
59
+
"key": "{#90}│ {#91}Disk {#90}│",
60
+
"format": "{$1}{size-used} / {size-total} ({size-percentage})"
61
+
},
62
+
{
63
+
"type": "shell",
64
+
"key": "{#90}│ {#95}Shell {#90}│",
65
+
"format": "{$1}{pretty-name} {#2}[v{version}] [PID:{pid}]"
66
+
},
67
+
{
68
+
"type": "localip",
69
+
"key": "{#90}│ {#94}Local IPv4 {#90}│",
70
+
"showPrefixLen": true,
71
+
"showIpv4": true,
72
+
"showIpv6": false,
73
+
"showMtu": true,
74
+
"format": "{$1}{ipv4} {#2}[{ifname}]"
75
+
},
76
+
{
77
+
"type": "publicip",
78
+
"key": "{#90}│ {#94}Public IPv4 {#90}│",
79
+
"ipv6": false,
80
+
"format": "{$1}{ip} {#2}[{location}]"
81
+
},
82
+
{
83
+
"type": "custom",
84
+
"key": "{#90}╰─────────────╯",
85
+
"format": "{#90}╰────────────────────────────────────────────────────────────╯"
86
+
},
87
+
"break",
88
+
{
89
+
"type": "custom",
90
+
"key": " ",
91
+
"format": "{#90}╭ Colors ───────────────────────────────────────────────────────────────────╮"
92
+
},
93
+
{
94
+
"type": "custom",
95
+
"format": "{#90}│ {#40} {#41} {#42} {#43} {#44} {#45} {#46} {#47} {#} {#90}│"
96
+
},
97
+
{
98
+
"type": "custom",
99
+
"format": "{#90}│ {#100} {#101} {#102} {#103} {#104} {#105} {#106} {#107} {#} {#90}│"
100
+
},
101
+
{
102
+
"type": "custom",
103
+
"format": "{#90}╰───────────────────────────────────────────────────────────────────────────╯"
104
+
}
105
+
]
106
+
}
+16
home/diogo/programs/fzf.nix
+16
home/diogo/programs/fzf.nix
···
1
+
{
2
+
programs.fzf = {
3
+
enable = true;
4
+
5
+
enableZshIntegration = true;
6
+
tmux.enableShellIntegration = true;
7
+
8
+
defaultOptions = [
9
+
"--height=40%"
10
+
"--layout=reverse"
11
+
"--border"
12
+
"--preview-window=right:60%"
13
+
"--preview 'bat --color=always --style=numbers --line-range=:500 {}'"
14
+
];
15
+
};
16
+
}
+22
home/diogo/programs/ghostty.nix
+22
home/diogo/programs/ghostty.nix
···
1
+
{ pkgs, config, ... }:
2
+
{
3
+
programs.ghostty = {
4
+
inherit (config.sys.profiles.graphical) enable;
5
+
package = pkgs.ghostty-bin;
6
+
enableZshIntegration = config.programs.zsh.enable;
7
+
installBatSyntax = config.programs.bat.enable;
8
+
settings = {
9
+
font-family = "Maple Mono";
10
+
font-size = 18;
11
+
font-thicken = true;
12
+
background-opacity = 0.95;
13
+
background-blur = true;
14
+
window-padding-x = 12;
15
+
window-padding-y = 12;
16
+
macos-titlebar-style = "tabs";
17
+
window-save-state = "always";
18
+
bell-features = "no-audio";
19
+
macos-option-as-alt = "left";
20
+
};
21
+
};
22
+
}
+99
home/diogo/programs/git.nix
+99
home/diogo/programs/git.nix
···
1
+
{ pkgs, config, ... }:
2
+
{
3
+
programs.git = {
4
+
package = pkgs.gitMinimal;
5
+
enable = true;
6
+
7
+
signing = {
8
+
key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICCTbCHJ0avif6MQ7izXlHHaubNsOhU2xf9lMvXKLyUQ";
9
+
format = "ssh";
10
+
signByDefault = true;
11
+
};
12
+
13
+
ignores = [
14
+
".DS_Store"
15
+
"*~"
16
+
"*.swp"
17
+
"*.bak"
18
+
"*.tmp"
19
+
"*.log"
20
+
".idea"
21
+
"changes.txt"
22
+
"*freeze.png"
23
+
".crush"
24
+
"**/.terraform/*"
25
+
"*.tfvars"
26
+
"*.tfvars.json"
27
+
"*.tfstate"
28
+
"*.tfstate.*"
29
+
".env*"
30
+
];
31
+
32
+
attributes = [
33
+
"* text=auto"
34
+
"*.sh text eol=lf"
35
+
"tsconfig.json linguist-language=JSON-with-Comments"
36
+
"*.lock text -diff"
37
+
];
38
+
39
+
settings = {
40
+
user = {
41
+
name = "Diogo";
42
+
email = "hello" + "@" + "diogo" + "." + "fi";
43
+
};
44
+
45
+
aliases = {
46
+
s = "status -s";
47
+
undo = "reset --soft HEAD^";
48
+
cleanup = ''
49
+
git fetch upstream; \
50
+
git checkout main; \
51
+
git pull upstream main; \
52
+
git push origin main; \
53
+
git branch -r --merged | grep -v main | grep origin | sed 's/origin\\///' | gxargs -r -n 1 git push --delete origin; \
54
+
git branch --merged | grep -v main | gxargs -r -n 1 git branch -d; \
55
+
git branch -vv | grep ': gone]'| grep -v '\\*' | awk '{ print $1; }' | gxargs -r git branch -D; \
56
+
git fetch --all --prune; \
57
+
git prune; \
58
+
git gc --aggressive;
59
+
'';
60
+
wopsy = "commit -a --amend --no-edit";
61
+
};
62
+
63
+
init.defaultBranch = "main";
64
+
65
+
commit.verbose = true;
66
+
67
+
push.autoSetupRemote = true;
68
+
69
+
merge = {
70
+
stat = "true";
71
+
conflictstyle = "zdiff3";
72
+
tool = "meld";
73
+
};
74
+
75
+
rebase = {
76
+
updateRefs = true;
77
+
autoSquash = true;
78
+
autoStash = true;
79
+
};
80
+
};
81
+
82
+
lfs.enable = true;
83
+
};
84
+
85
+
programs.lazygit = {
86
+
enable = config.programs.git.enable && config.sys.profiles.graphical.enable;
87
+
};
88
+
89
+
programs.delta = {
90
+
enable = true;
91
+
enableGitIntegration = true;
92
+
options = {
93
+
line-numbers = true;
94
+
hyperlinks = true;
95
+
side-by-side = true;
96
+
navigate = true;
97
+
};
98
+
};
99
+
}
+38
home/diogo/programs/neovim/.vimrc
+38
home/diogo/programs/neovim/.vimrc
···
1
+
let mapleader = " "
2
+
3
+
set hlsearch
4
+
set incsearch
5
+
set ignorecase
6
+
set smartcase
7
+
8
+
set number
9
+
set relativenumber
10
+
set linebreak
11
+
12
+
set noswapfile
13
+
set nobackup
14
+
set undodir=~/.vim/undodir
15
+
set undofile
16
+
17
+
set so=4
18
+
19
+
set expandtab
20
+
set tabstop=2 softtabstop=2
21
+
set shiftwidth=2
22
+
23
+
set hidden
24
+
set noerrorbells
25
+
set mouse="a"
26
+
27
+
syntax on
28
+
filetype plugin indent on
29
+
set updatetime=500
30
+
31
+
set spell
32
+
set spelllang=en_gb
33
+
34
+
inoremap <Esc> <Esc>
35
+
36
+
nnoremap <leader>w :w<CR>
37
+
nnoremap <leader>q :q<CR>
38
+
nnoremap <leader>Q :q!<CR>
+56
home/diogo/programs/neovim/default.nix
+56
home/diogo/programs/neovim/default.nix
···
1
+
{ pkgs, ... }:
2
+
{
3
+
programs.neovim = {
4
+
enable = true;
5
+
defaultEditor = true;
6
+
viAlias = true;
7
+
vimAlias = true;
8
+
withNodeJs = true;
9
+
plugins = with pkgs.vimPlugins; [
10
+
catppuccin-nvim
11
+
nvim-cmp
12
+
cmp-buffer
13
+
cmp-nvim-lsp
14
+
cmp-path
15
+
conform-nvim
16
+
gitsigns-nvim
17
+
lualine-nvim
18
+
mini-nvim
19
+
nvim-lspconfig
20
+
nvim-navic
21
+
nvim-tree-lua
22
+
plenary-nvim
23
+
telescope-file-browser-nvim
24
+
telescope-fzf-native-nvim
25
+
telescope-nvim
26
+
which-key-nvim
27
+
nvim-treesitter.withAllGrammars
28
+
cord-nvim
29
+
];
30
+
extraPackages = with pkgs; [
31
+
nixd
32
+
nil
33
+
vtsls
34
+
vue-language-server
35
+
# docker-language-server
36
+
# docker-compose-language-service
37
+
yaml-language-server
38
+
bash-language-server
39
+
lua-language-server
40
+
astro-language-server
41
+
tailwindcss-language-server
42
+
emmet-language-server
43
+
gopls
44
+
sourcekit-lsp
45
+
];
46
+
47
+
extraLuaConfig = ''
48
+
${builtins.readFile ./init.lua}
49
+
vim.cmd("colorscheme catppuccin")
50
+
'';
51
+
};
52
+
53
+
home.file = {
54
+
".vimrc".text = builtins.readFile ./.vimrc;
55
+
};
56
+
}
+476
home/diogo/programs/neovim/init.lua
+476
home/diogo/programs/neovim/init.lua
···
1
+
vim.cmd("source ~/.vimrc")
2
+
3
+
local cmp = require("cmp")
4
+
5
+
cmp.setup({
6
+
mapping = {
7
+
["<C-n>"] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }),
8
+
["<C-p>"] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }),
9
+
10
+
["<Tab>"] = cmp.mapping(function(fallback)
11
+
if cmp.visible() then
12
+
cmp.confirm({ select = true })
13
+
else
14
+
fallback()
15
+
end
16
+
end, { "i", "s" }),
17
+
},
18
+
19
+
sources = cmp.config.sources({
20
+
{
21
+
name = "nvim_lsp",
22
+
---@param entry cmp.Entry
23
+
---@param ctx cmp.Context
24
+
entry_filter = function(entry, ctx)
25
+
if ctx.filetype ~= "vue" then
26
+
return true
27
+
end
28
+
29
+
local cursor_before_line = ctx.cursor_before_line
30
+
if cursor_before_line:sub(-1) == "@" then
31
+
return entry.completion_item.label:match("^@")
32
+
elseif cursor_before_line:sub(-1) == ":" then
33
+
return entry.completion_item.label:match("^:")
34
+
and not entry.completion_item.label:match("^:on%-")
35
+
else
36
+
return true
37
+
end
38
+
end,
39
+
},
40
+
{ name = "buffer" },
41
+
{ name = "path" },
42
+
}),
43
+
44
+
formatting = {
45
+
format = function(entry, item)
46
+
item.menu = ({
47
+
nvim_lsp = "[LSP]",
48
+
buffer = "[Buffer]",
49
+
path = "[Path]",
50
+
})[entry.source.name]
51
+
return item
52
+
end,
53
+
},
54
+
})
55
+
56
+
cmp.event:on("menu_closed", function()
57
+
local bufnr = vim.api.nvim_get_current_buf()
58
+
vim.b[bufnr]._vue_ts_cached_is_in_start_tag = nil
59
+
end)
60
+
61
+
require("conform").setup({
62
+
formatters_by_ft = {
63
+
lua = { "stylua" },
64
+
vue = { "prettierd", "prettier", stop_after_first = true },
65
+
typescript = { "prettierd", "prettier", stop_after_first = true },
66
+
javascript = { "prettierd", "prettier", stop_after_first = true },
67
+
javascriptreact = { "prettierd", "prettier", stop_after_first = true },
68
+
css = { "prettierd", "prettier", stop_after_first = true },
69
+
},
70
+
format_on_save = {
71
+
timeout_ms = 500,
72
+
lsp_format = "fallback",
73
+
},
74
+
})
75
+
76
+
vim.keymap.set({ "n", "v" }, "<leader>f", function()
77
+
require("conform").format({ timeout_ms = 500, lsp_format = "fallback" })
78
+
end, { desc = "Format buffer or selection" })
79
+
80
+
require("gitsigns").setup({
81
+
current_line_blame = true,
82
+
current_line_blame_opts = {
83
+
virt_text = true,
84
+
virt_text_pos = "eol",
85
+
delay = 100,
86
+
ignore_whitespace = false,
87
+
},
88
+
current_line_blame_formatter = "<author>, <author_time:%d-%m-%Y> - <summary>",
89
+
})
90
+
91
+
local navic = require("nvim-navic")
92
+
93
+
navic.setup({
94
+
separator = " › ",
95
+
highlight = true,
96
+
})
97
+
98
+
vim.api.nvim_create_autocmd("LspAttach", {
99
+
callback = function(event)
100
+
local client = vim.lsp.get_client_by_id(event.data.client_id)
101
+
if client.server_capabilities.documentSymbolProvider then
102
+
navic.attach(client, event.buf)
103
+
end
104
+
vim.lsp.inlay_hint.enable(true, { bufnr = event.buf })
105
+
end,
106
+
})
107
+
108
+
local servers = {
109
+
lua_ls = {
110
+
settings = {
111
+
Lua = {
112
+
runtime = {
113
+
version = "LuaJIT",
114
+
},
115
+
diagnostics = {
116
+
globals = { "vim" },
117
+
},
118
+
hint = { enable = true },
119
+
},
120
+
},
121
+
},
122
+
123
+
yamlls = {
124
+
settings = {
125
+
yaml = {
126
+
completion = true,
127
+
validate = true,
128
+
suggest = {
129
+
parentSkeletonSelectedFirst = true,
130
+
},
131
+
schemas = {
132
+
["https://www.schemastore.org/github-workflow.json"] = ".github/workflows/*",
133
+
["https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json"] = "docker-compose*.{yml,yaml}",
134
+
},
135
+
},
136
+
redhat = {
137
+
telemetry = {
138
+
enable = false,
139
+
},
140
+
},
141
+
},
142
+
},
143
+
144
+
jsonls = {
145
+
settings = {
146
+
json = {
147
+
validate = { enable = true },
148
+
schemas = {
149
+
{
150
+
fileMatch = { "package.json" },
151
+
url = "https://www.schemastore.org/package.json",
152
+
},
153
+
{
154
+
fileMatch = { "tsconfig*.json" },
155
+
url = "https://www.schemastore.org/tsconfig.json",
156
+
},
157
+
},
158
+
},
159
+
},
160
+
},
161
+
162
+
vtsls = {
163
+
settings = {
164
+
vtsls = {
165
+
tsserver = {
166
+
globalPlugins = {
167
+
{
168
+
name = "@vue/typescript-plugin",
169
+
location = "~/.bun/bin/vue-language-server",
170
+
languages = { "vue" },
171
+
configNamespace = "typescript",
172
+
},
173
+
},
174
+
},
175
+
},
176
+
},
177
+
filetypes = { "typescript", "javascript", "vue" },
178
+
},
179
+
180
+
vue_ls = {},
181
+
182
+
nil_ls = {
183
+
cmd = { "nil" },
184
+
settings = {
185
+
["nil"] = {
186
+
diagnostics = {
187
+
bindingEndHintMinLines = 2,
188
+
},
189
+
nix = { maxMemoryMB = nil },
190
+
},
191
+
},
192
+
},
193
+
194
+
just = {},
195
+
196
+
-- dockerls = {},
197
+
198
+
astro = {},
199
+
200
+
emmet_language_server = {
201
+
filetypes = {
202
+
"vue",
203
+
"astro",
204
+
"css",
205
+
"html",
206
+
"javascript",
207
+
"javascriptreact",
208
+
"typescriptreact",
209
+
},
210
+
},
211
+
212
+
tailwindcss = {
213
+
filetypes = {
214
+
"vue",
215
+
"astro",
216
+
"javascriptreact",
217
+
"typescriptreact",
218
+
"html",
219
+
"css",
220
+
},
221
+
},
222
+
223
+
gopls = {},
224
+
225
+
sourcekit = {},
226
+
}
227
+
228
+
vim.diagnostic.config({
229
+
virtual_text = true,
230
+
signs = true,
231
+
underline = true,
232
+
update_in_insert = false,
233
+
float = {
234
+
focusable = false,
235
+
style = "minimal",
236
+
border = "rounded",
237
+
source = "if_many",
238
+
header = "",
239
+
prefix = "",
240
+
},
241
+
})
242
+
243
+
for server, config in pairs(servers) do
244
+
vim.lsp.config(server, config)
245
+
vim.lsp.enable(server)
246
+
end
247
+
248
+
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
249
+
border = "rounded",
250
+
max_width = 80,
251
+
})
252
+
253
+
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, { desc = "Rename symbol" })
254
+
vim.keymap.set(
255
+
"n",
256
+
"K",
257
+
vim.lsp.buf.hover,
258
+
{ noremap = true, silent = true, desc = "LSP Hover Documentation" }
259
+
)
260
+
261
+
require("lualine").setup({
262
+
options = {
263
+
icons_enabled = false,
264
+
theme = "auto",
265
+
globalstatus = true,
266
+
component_separators = "",
267
+
section_separators = "",
268
+
always_divide_middle = true,
269
+
ignore_focus = { "NvimTree" },
270
+
disabled_filetypes = {
271
+
statusline = { "NvimTree" },
272
+
winbar = { "NvimTree" },
273
+
},
274
+
},
275
+
sections = {
276
+
lualine_a = { "mode" },
277
+
lualine_b = {
278
+
{ "branch" },
279
+
"diff",
280
+
},
281
+
lualine_c = { { "filename", path = 1, shorting_target = 40 } },
282
+
lualine_x = { "diagnostics" },
283
+
lualine_y = { "progress" },
284
+
lualine_z = { "location" },
285
+
},
286
+
inactive_sections = {
287
+
lualine_a = {},
288
+
lualine_b = {},
289
+
lualine_c = {},
290
+
lualine_x = {},
291
+
lualine_y = {},
292
+
lualine_z = {},
293
+
},
294
+
tabline = {},
295
+
winbar = {
296
+
lualine_c = {
297
+
{
298
+
"navic",
299
+
cond = function()
300
+
return require("nvim-navic").is_available()
301
+
end,
302
+
},
303
+
},
304
+
},
305
+
inactive_winbar = {},
306
+
extensions = {},
307
+
})
308
+
vim.opt.showmode = false
309
+
vim.o.cmdheight = 0
310
+
vim.o.laststatus = 3
311
+
312
+
require("mini.pairs").setup()
313
+
314
+
require("mini.notify").setup({
315
+
window = {
316
+
winblend = 0,
317
+
lsp_progress = {
318
+
enable = true,
319
+
},
320
+
},
321
+
})
322
+
323
+
vim.notify = require("mini.notify").make_notify()
324
+
vim.api.nvim_create_autocmd("BufWritePost", {
325
+
callback = function(args)
326
+
local ft = vim.bo[args.buf].filetype
327
+
if ft == "" or vim.bo[args.buf].buftype ~= "" then
328
+
return
329
+
end
330
+
331
+
local fn = vim.fn.fnamemodify(args.file, ":t")
332
+
vim.notify("Saved " .. fn, vim.log.levels.INFO, { title = "File Written" })
333
+
end,
334
+
})
335
+
336
+
require("mini.move").setup({
337
+
mappings = {
338
+
left = "<M-h>",
339
+
right = "<M-l>",
340
+
down = "<M-j>",
341
+
up = "<M-k>",
342
+
line_left = "<M-h>",
343
+
line_right = "<M-l>",
344
+
line_down = "<M-j>",
345
+
line_up = "<M-k>",
346
+
},
347
+
options = {
348
+
reindent_linewise = true,
349
+
},
350
+
})
351
+
352
+
require("mini.comment").setup({
353
+
options = {
354
+
custom_commentstring = nil,
355
+
ignore_blank_line = false,
356
+
start_of_line = false,
357
+
pad_comment_parts = true,
358
+
},
359
+
mappings = {
360
+
comment = "gc",
361
+
comment_line = "gcc",
362
+
},
363
+
})
364
+
365
+
require("mini.surround").setup({
366
+
mappings = {
367
+
add = "S", -- Add surrounding in Normal and Visual modes
368
+
delete = "ds", -- Delete surrounding
369
+
find = "sf", -- Find surrounding (to the right)
370
+
find_left = "sF", -- Find surrounding (to the left)
371
+
highlight = "sh", -- Highlight surrounding
372
+
replace = "cs", -- Replace surrounding
373
+
},
374
+
})
375
+
376
+
require("telescope").setup({
377
+
defaults = {
378
+
file_ignore_patterns = { "bun.lock" },
379
+
},
380
+
extensions = {
381
+
fzf = {
382
+
fuzzy = true,
383
+
override_generic_sorter = true,
384
+
override_file_sorter = true,
385
+
case_mode = "smart_case",
386
+
},
387
+
},
388
+
})
389
+
390
+
require("telescope").load_extension("fzf")
391
+
require("telescope").load_extension("file_browser")
392
+
393
+
local opts = { noremap = true, silent = true }
394
+
vim.api.nvim_set_keymap(
395
+
"n",
396
+
"<leader>ff",
397
+
"<cmd>lua require('telescope.builtin').find_files()<CR>",
398
+
opts
399
+
)
400
+
vim.api.nvim_set_keymap(
401
+
"n",
402
+
"<leader>fg",
403
+
"<cmd>lua require('telescope.builtin').live_grep()<CR>",
404
+
opts
405
+
)
406
+
vim.api.nvim_set_keymap(
407
+
"n",
408
+
"<leader>fl",
409
+
"<cmd>lua require('telescope.builtin').current_buffer_fuzzy_find()<CR>",
410
+
opts
411
+
)
412
+
vim.api.nvim_set_keymap(
413
+
"n",
414
+
"<leader>fr",
415
+
"<cmd>lua require('telescope.builtin').lsp_references()<CR>",
416
+
opts
417
+
)
418
+
vim.api.nvim_set_keymap(
419
+
"n",
420
+
"<leader>fd",
421
+
"<cmd>lua require('telescope.builtin').lsp_definitions()<CR>",
422
+
opts
423
+
)
424
+
vim.api.nvim_set_keymap(
425
+
"n",
426
+
"<leader>ft",
427
+
"<cmd>lua require('telescope.builtin').lsp_type_definitions()<CR>",
428
+
opts
429
+
)
430
+
vim.api.nvim_set_keymap("n", "<leader>fi", "<cmd>Telescope lsp_implementations<CR>", opts)
431
+
vim.api.nvim_set_keymap("n", "<C-j>", "<cmd>Telescope lsp_document_symbols<CR>", opts)
432
+
433
+
vim.g.loaded_netrw = 1
434
+
vim.g.loaded_netrwPlugin = 1
435
+
436
+
require("nvim-tree").setup({
437
+
renderer = {
438
+
icons = {
439
+
show = {
440
+
file = false,
441
+
folder = false,
442
+
folder_arrow = true,
443
+
git = false,
444
+
modified = true,
445
+
},
446
+
},
447
+
},
448
+
view = {
449
+
width = 30,
450
+
side = "right",
451
+
},
452
+
disable_netrw = true,
453
+
hijack_netrw = true,
454
+
update_focused_file = { enable = true },
455
+
filters = { dotfiles = false },
456
+
git = { enable = false },
457
+
})
458
+
459
+
vim.keymap.set("n", "<C-b>", ":NvimTreeToggle<CR>", { desc = "Toggle file explorer" })
460
+
vim.keymap.set("n", "<leader>e", ":NvimTreeFocus<CR>", { desc = "Focus file explorer" })
461
+
462
+
require("nvim-treesitter.configs").setup({
463
+
highlight = { enable = true, additional_vim_regex_highlighting = true },
464
+
indent = { enable = true },
465
+
})
466
+
467
+
vim.keymap.set("n", "<leader>?", function()
468
+
require("which-key").show({ global = false })
469
+
end, { desc = "Buffer Local Keymaps (which-key)" })
470
+
471
+
require("cord").setup({})
472
+
473
+
require("catppuccin").setup({
474
+
flavour = "mocha",
475
+
transparent_background = true,
476
+
})
+93
home/diogo/programs/ohmyposh/config.json
+93
home/diogo/programs/ohmyposh/config.json
···
1
+
{
2
+
"$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/ohmyposh/main/themes/schema.json",
3
+
"secondary_prompt": {
4
+
"template": "~~> ",
5
+
"foreground": "magenta",
6
+
"background": "transparent"
7
+
},
8
+
"transient_prompt": {
9
+
"template": "~> ",
10
+
"background": "transparent",
11
+
"foreground_templates": [
12
+
"{{if gt .Code 0}}red{{end}}",
13
+
"{{if eq .Code 0}}magenta{{end}}"
14
+
]
15
+
},
16
+
"upgrade": {
17
+
"source": "cdn",
18
+
"interval": "168h",
19
+
"auto": false,
20
+
"notice": false
21
+
},
22
+
"blocks": [
23
+
{
24
+
"type": "prompt",
25
+
"alignment": "left",
26
+
"segments": [
27
+
{
28
+
"properties": {
29
+
"cache_duration": "none",
30
+
"style": "full"
31
+
},
32
+
"template": "{{ .Path }} ",
33
+
"foreground": "blue",
34
+
"background": "transparent",
35
+
"type": "path",
36
+
"style": "plain"
37
+
},
38
+
{
39
+
"properties": {
40
+
"branch_icon": "",
41
+
"cache_duration": "none",
42
+
"commit_icon": "@",
43
+
"fetch_status": true
44
+
},
45
+
"template": "{{ .HEAD }}{{ if or (.Working.Changed) (.Staging.Changed) }}*{{ end }} <cyan>{{ if gt .Behind 0 }}\u21e3{{ end }}{{ if gt .Ahead 0 }}\u21e1{{ end }}</>",
46
+
"foreground": "p:grey",
47
+
"background": "transparent",
48
+
"type": "git",
49
+
"style": "plain"
50
+
}
51
+
],
52
+
"newline": true
53
+
},
54
+
{
55
+
"type": "rprompt",
56
+
"overflow": "hidden",
57
+
"segments": [
58
+
{
59
+
"properties": {
60
+
"cache_duration": "none",
61
+
"threshold": 5000
62
+
},
63
+
"template": "{{ .FormattedMs }}",
64
+
"foreground": "yellow",
65
+
"background": "transparent",
66
+
"type": "executiontime",
67
+
"style": "plain"
68
+
}
69
+
]
70
+
},
71
+
{
72
+
"type": "prompt",
73
+
"alignment": "left",
74
+
"segments": [
75
+
{
76
+
"properties": {
77
+
"cache_duration": "none"
78
+
},
79
+
"template": "~>",
80
+
"background": "transparent",
81
+
"type": "text",
82
+
"style": "plain",
83
+
"foreground_templates": [
84
+
"{{if gt .Code 0}}red{{end}}",
85
+
"{{if eq .Code 0}}magenta{{end}}"
86
+
]
87
+
}
88
+
]
89
+
}
90
+
],
91
+
"version": 3,
92
+
"final_space": true
93
+
}
+7
home/diogo/programs/ohmyposh/default.nix
+7
home/diogo/programs/ohmyposh/default.nix
+12
home/diogo/programs/ripgrep.nix
+12
home/diogo/programs/ripgrep.nix
+48
home/diogo/programs/tmux.nix
+48
home/diogo/programs/tmux.nix
···
1
+
{ pkgs, ... }:
2
+
{
3
+
programs.tmux = {
4
+
enable = true;
5
+
plugins = with pkgs.tmuxPlugins; [
6
+
catppuccin
7
+
];
8
+
extraConfig = ''
9
+
set -g mouse on
10
+
set -s escape-time 0
11
+
set -g default-terminal "tmux-256color"
12
+
set -sa terminal-overrides ",xterm*:Tc"
13
+
14
+
unbind C-b
15
+
set -g prefix C-a
16
+
bind C-a send-prefix
17
+
18
+
bind r source-file ~/.tmux.conf \; display-message "tmux config reloaded!"
19
+
20
+
bind -n C-k send-keys C-l
21
+
22
+
bind -r h select-pane -L
23
+
bind -r j select-pane -D
24
+
bind -r k select-pane -U
25
+
bind -r l select-pane -R
26
+
bind v split-window -h
27
+
bind n split-window -v
28
+
bind x kill-pane
29
+
30
+
bind w new-window -c "#{pane_current_path}"
31
+
bind n next-window
32
+
bind p previous-window
33
+
34
+
set -g @catppuccin_flavor 'mocha'
35
+
set -g @catppuccin_window_status_style "basic"
36
+
set -g @catppuccin_window_number "#I"
37
+
set -g @catppuccin_window_text " #{pane_current_command}"
38
+
set -g @catppuccin_window_current_number "#[bold]#I"
39
+
set -g @catppuccin_window_current_text " #{pane_current_command}"
40
+
41
+
set -g status-right-length 100
42
+
set -g status-left-length 100
43
+
set -g status-style "bg=default"
44
+
set -g status-left ""
45
+
set -g status-right ""
46
+
'';
47
+
};
48
+
}
+142
home/diogo/programs/vesktop.nix
+142
home/diogo/programs/vesktop.nix
···
1
+
{ config, ... }:
2
+
{
3
+
programs.vesktop = {
4
+
inherit (config.sys.profiles.graphical) enable;
5
+
settings = {
6
+
discordBranch = "canary";
7
+
transparencyOption = "acrylic";
8
+
disableSmoothScroll = false;
9
+
hardwareAcceleration = true;
10
+
arRPC = true;
11
+
appBadge = true;
12
+
};
13
+
vencord.settings = {
14
+
plugins = {
15
+
AppleMusicRichPresence = {
16
+
enabled = true;
17
+
refreshInterval = 5;
18
+
largeImageType = "Album";
19
+
smallImageType = "Artist";
20
+
largeTextString = "{album}";
21
+
smallTextString = "{artist}";
22
+
enableButtons = false;
23
+
nameString = "Apple Music";
24
+
detailsString = "{name}";
25
+
stateString = "{artist} · {album}";
26
+
enableTimestamps = true;
27
+
activityType = 2;
28
+
};
29
+
FakeNitro.enabled = true;
30
+
FixYoutubeEmbeds.enabled = true;
31
+
FixSpotifyEmbeds.enabled = true;
32
+
FixImagesQuality.enabled = true;
33
+
FixCodeblockGap.enabled = true;
34
+
ForceOwnerCrown.enabled = true;
35
+
FriendsSince.enabled = true;
36
+
ImageZoom.enabled = true;
37
+
LastFMRichPresence = {
38
+
enabled = true;
39
+
hideWithActivity = false;
40
+
hideWithSpotify = true;
41
+
shareUsername = false;
42
+
shareSong = true;
43
+
statusName = "";
44
+
nameFormat = "artist";
45
+
useListeningStatus = true;
46
+
missingArt = "lastfmLogo";
47
+
showLastFmLogo = true;
48
+
};
49
+
MessageLogger = {
50
+
enabled = true;
51
+
collapseDeleted = true;
52
+
deleteStyle = "text";
53
+
ignoreBots = false;
54
+
ignoreSelf = true;
55
+
logEdits = true;
56
+
logDeletes = true;
57
+
inlineEdits = true;
58
+
};
59
+
NSFWGateBypass.enabled = true;
60
+
PlatformIndicators.enabled = true;
61
+
ReviewDB.enabled = true;
62
+
RoleColorEverywhere.enabled = true;
63
+
SecretRingToneEnabler.enabled = true;
64
+
ShikiCodeblocks.enabled = true;
65
+
ShowHiddenChannels.enabled = true;
66
+
ShowHiddenThings.enabled = true;
67
+
SpotifyControls = {
68
+
enabled = true;
69
+
hoverControls = true;
70
+
};
71
+
SpotifyCrack = {
72
+
enabled = true;
73
+
noSpotifyAutoPause = true;
74
+
keepSpotifyActivityOnIdle = false;
75
+
};
76
+
StreamerModeOnStream.enabled = true;
77
+
TextReplace = {
78
+
enabled = true;
79
+
stringRules = [
80
+
{
81
+
find = "://bsky.app/";
82
+
replace = "://fxbsky.app/";
83
+
}
84
+
{
85
+
find = "://instagram.com/";
86
+
replace = "://ddinstagram.com/";
87
+
}
88
+
{
89
+
find = "://www.instagram.com/";
90
+
replace = "://ddinstagram.com/";
91
+
}
92
+
{
93
+
find = "://reddit.com/";
94
+
replace = "://rxddit.com/";
95
+
}
96
+
{
97
+
find = "://www.reddit.com/";
98
+
replace = "://rxddit.com/";
99
+
}
100
+
{
101
+
find = "://tiktok.com/";
102
+
replace = "://tfxktok.com/";
103
+
}
104
+
{
105
+
find = "://vm.tiktok.com/";
106
+
replace = "://vm.vxtiktok.com/";
107
+
}
108
+
{
109
+
find = "://twitter.com/";
110
+
replace = "://fxtwitter.com/";
111
+
}
112
+
{
113
+
find = "://x.com/";
114
+
replace = "://fxtwitter.com/";
115
+
}
116
+
];
117
+
};
118
+
TypingIndicator = {
119
+
enabled = true;
120
+
includeMutedChannels = false;
121
+
includeCurrentChannel = true;
122
+
indicatorMode = 3;
123
+
};
124
+
TypingTweaks = {
125
+
enabled = true;
126
+
alternativeFormatting = true;
127
+
showRoleColors = true;
128
+
showAvatars = true;
129
+
};
130
+
UserMessagesPronouns.enabled = true;
131
+
USRBG.enabled = true;
132
+
WhoReacted.enabled = true;
133
+
NoTrack = {
134
+
enabled = true;
135
+
disableAnalytics = true;
136
+
};
137
+
Settings.enabled = true;
138
+
ClearURLs.enabled = true;
139
+
};
140
+
};
141
+
};
142
+
}
+32
home/diogo/programs/zed.nix
+32
home/diogo/programs/zed.nix
···
1
+
{ config, ... }:
2
+
{
3
+
programs.zed-editor = {
4
+
inherit (config.sys.profiles.graphical) enable;
5
+
6
+
userSettings = {
7
+
telemetry = {
8
+
diagnostics = false;
9
+
metrics = false;
10
+
};
11
+
12
+
vim_mode = true;
13
+
14
+
ui_font_size = 16;
15
+
buffer_font_family = "Maple Mono";
16
+
buffer_font_size = 18;
17
+
18
+
project_panel = {
19
+
dock = "right";
20
+
};
21
+
};
22
+
extensions = [
23
+
"git-firefly"
24
+
"vue"
25
+
# "dockerfile"
26
+
# "docker-compose"
27
+
"nix"
28
+
"discord-presence"
29
+
"astro"
30
+
];
31
+
};
32
+
}
+214
home/diogo/programs/zen.nix
+214
home/diogo/programs/zen.nix
···
1
+
{
2
+
inputs,
3
+
...
4
+
}:
5
+
{
6
+
imports = [
7
+
inputs.zen-browser.homeModules.beta
8
+
];
9
+
10
+
programs.zen-browser = {
11
+
enable = true;
12
+
13
+
policies = {
14
+
AppAutoUpdate = false;
15
+
DisableAppUpdate = true;
16
+
ManualAppUpdateOnly = true;
17
+
DisableFirefoxStudies = true;
18
+
DisablePocket = true;
19
+
DisableTelemetry = true;
20
+
DontCheckDefaultBrowser = true;
21
+
OfferToSaveLogins = false;
22
+
NoDefaultBookmarks = true;
23
+
Cookies = {
24
+
Allow = [
25
+
"https://bsky.app"
26
+
"https://bsky.social"
27
+
"https://tangled.org"
28
+
"https://github.com"
29
+
"https://steamcommunity.com"
30
+
"https://steampowered.com"
31
+
"https://google.com"
32
+
"https://youtube.com"
33
+
"https://bunny.net"
34
+
"https://twitch.tv"
35
+
"https://apple.com"
36
+
"https://icloud.com"
37
+
"https://instagram.com"
38
+
"https://porkbun.com"
39
+
"https://amazon.es"
40
+
"https://upcloud.com"
41
+
"https://chatgpt.com"
42
+
"https://openai.com"
43
+
"https://revolut.com"
44
+
"https://proton.me"
45
+
"https://bitwarden.com"
46
+
"https://bitwarden.eu"
47
+
"https://catsky.social"
48
+
"https://gandi.net"
49
+
"https://stripe.com"
50
+
"http://10.100.0.1"
51
+
"http://[fd00:1:1:1::1]"
52
+
];
53
+
};
54
+
SanitizeOnShutdown = {
55
+
Cache = true;
56
+
Cookies = true;
57
+
FormData = true;
58
+
};
59
+
DisableFirefoxAccounts = true;
60
+
DNSOverHTTPS = {
61
+
Enabled = true;
62
+
ProviderURL = "https://dns.quad9.net/dns-query";
63
+
Fallback = true;
64
+
Locked = true;
65
+
};
66
+
EnableTrackingProtection = {
67
+
Value = true;
68
+
Locked = true;
69
+
Cryptomining = true;
70
+
Fingerprinting = true;
71
+
EmailTracking = true;
72
+
};
73
+
HttpsOnlyMode = "force_enabled";
74
+
SkipTermsOfUse = true;
75
+
Extensions = {
76
+
Install = [
77
+
"https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi"
78
+
"https://addons.mozilla.org/firefox/downloads/latest/catppuccin-web-file-icons/latest.xpi"
79
+
"https://addons.mozilla.org/firefox/downloads/latest/clearurls/latest.xpi"
80
+
"https://addons.mozilla.org/firefox/downloads/latest/return-youtube-dislikes/latest.xpi"
81
+
"https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi"
82
+
"https://addons.mozilla.org/firefox/downloads/latest/steam-database/latest.xpi"
83
+
"https://addons.mozilla.org/firefox/downloads/latest/styl-us/latest.xpi"
84
+
"https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"
85
+
"https://addons.mozilla.org/firefox/downloads/latest/refined-github-/latest.xpi"
86
+
"https://addons.mozilla.org/firefox/downloads/latest/web-scrobbler/latest.xpi"
87
+
];
88
+
};
89
+
SearchEngines = {
90
+
Add = [
91
+
{
92
+
Name = "Qwant";
93
+
IconURL = "https://www.qwant.com/favicon.ico";
94
+
URLTemplate = "https://www.qwant.com/?q={searchTerms}";
95
+
Alias = "qwant";
96
+
SuggestURLTemplate = "https://api.qwant.com/api/suggest/?q={searchTerms}";
97
+
}
98
+
];
99
+
Default = "Qwant";
100
+
};
101
+
};
102
+
103
+
profiles.default = rec {
104
+
settings = {
105
+
"zen.workspaces.continue-where-left-off" = true;
106
+
"zen.welcome-screen.seen" = true;
107
+
"zen.tabs.vertical.right-side" = true;
108
+
"zen.urlbar.behavior" = "float";
109
+
"zen.view.sidebar-expanded" = false;
110
+
"zen.view.use-single-toolbar" = false;
111
+
};
112
+
113
+
pinsForce = true;
114
+
pins = {
115
+
"YouTube" = {
116
+
id = "c1e24192-acf6-4454-a4e0-b57483e6fd49";
117
+
workspace = spaces."Personal".id;
118
+
url = "https://youtube.com";
119
+
position = 101;
120
+
isEssential = true;
121
+
};
122
+
"Tangled" = {
123
+
id = "c1d9c4f8-ec95-4f41-93fd-76a92f5fdf16";
124
+
workspace = spaces."Personal".id;
125
+
url = "https://tangled.org";
126
+
position = 102;
127
+
isEssential = true;
128
+
};
129
+
"Bluesky" = {
130
+
id = "f58aa4ce-5915-41c8-b117-b11c32531198";
131
+
workspace = spaces."Personal".id;
132
+
url = "https://catsky.social";
133
+
position = 103;
134
+
isEssential = true;
135
+
};
136
+
137
+
"GitHub" = {
138
+
id = "b3bf5dfd-f08b-4407-a9c3-8ce40eb53e74";
139
+
workspace = spaces."Personal".id;
140
+
url = "https://github.com";
141
+
position = 104;
142
+
isEssential = false;
143
+
};
144
+
"Codeberg" = {
145
+
id = "34db494e-0238-44b0-8836-b1cdfa82e677";
146
+
workspace = spaces."Personal".id;
147
+
url = "https://codeberg.org";
148
+
position = 105;
149
+
isEssential = false;
150
+
};
151
+
"Bunny" = {
152
+
id = "e82607e2-2f86-4d9a-9168-65d4cd766f5e";
153
+
workspace = spaces."Personal".id;
154
+
url = "https://dash.bunny.net";
155
+
position = 106;
156
+
isEssential = false;
157
+
};
158
+
"Porkbun" = {
159
+
id = "66a2c410-915f-4bb2-91a8-4fc83633382b";
160
+
workspace = spaces."Personal".id;
161
+
url = "https://porkbun.com/account/domainsSpeedy";
162
+
position = 107;
163
+
isEssential = false;
164
+
};
165
+
"UpCloud" = {
166
+
id = "95ee2678-e60d-4f2b-9b8b-4da2f246b197";
167
+
workspace = spaces."Personal".id;
168
+
url = "https://hub.upcloud.com";
169
+
position = 108;
170
+
isEssential = false;
171
+
};
172
+
"Gandi" = {
173
+
id = "53418beb-79a3-41d5-b0ba-75d3a48188b5";
174
+
workspace = spaces."Personal".id;
175
+
url = "https://admin.gandi.net";
176
+
position = 109;
177
+
isEssential = false;
178
+
};
179
+
};
180
+
181
+
containersForce = true;
182
+
containers = {
183
+
Shopping = {
184
+
color = "yellow";
185
+
icon = "dollar";
186
+
id = 2;
187
+
};
188
+
};
189
+
190
+
spacesForce = true;
191
+
spaces = {
192
+
"Personal" = {
193
+
id = "8abbe7cb-3f97-446f-b986-f2f598cd0bdc";
194
+
icon = "🌷";
195
+
position = 1000;
196
+
theme = {
197
+
type = "gradient";
198
+
colors = [
199
+
{
200
+
red = 216;
201
+
green = 204;
202
+
blue = 235;
203
+
algorithm = "floating";
204
+
type = "explicit-lightness";
205
+
}
206
+
];
207
+
opacity = 0.8;
208
+
texture = 0.5;
209
+
};
210
+
};
211
+
};
212
+
};
213
+
};
214
+
}
+61
home/diogo/programs/zsh.nix
+61
home/diogo/programs/zsh.nix
···
1
+
{ pkgs, ... }:
2
+
{
3
+
programs.zsh = {
4
+
enable = true;
5
+
enableCompletion = true;
6
+
autosuggestion.enable = true;
7
+
syntaxHighlighting.enable = true;
8
+
9
+
initContent = ''
10
+
source <(fzf --zsh)
11
+
echo -e "\e[35m"
12
+
/bin/cat <<'EOF'
13
+
╱|、
14
+
(˚ˎ。7
15
+
|、˜〵
16
+
じしˍ,)ノ
17
+
EOF
18
+
echo -e "\e[0m"
19
+
'';
20
+
21
+
envExtra = ''
22
+
${
23
+
if pkgs.stdenv.hostPlatform.isDarwin then
24
+
''export SSH_AUTH_SOCK=~/Library/Containers/com.bitwarden.desktop/Data/.bitwarden-ssh-agent.sock''
25
+
else
26
+
''''
27
+
}
28
+
'';
29
+
30
+
shellAliases = {
31
+
cat = "bat";
32
+
cd = "z";
33
+
cp = "cp -iv";
34
+
mv = "mv -iv";
35
+
rm = "rm -rfv";
36
+
mkdir = "mkdir -pv";
37
+
p = "cd ~/Developer/";
38
+
dl = "cd ~/Downloads/";
39
+
f = "open -a Finder";
40
+
ls = "eza";
41
+
g = "git";
42
+
lg = "lazygit";
43
+
grep = "rg";
44
+
find = "fd";
45
+
};
46
+
};
47
+
48
+
programs.zoxide = {
49
+
enable = true;
50
+
enableZshIntegration = true;
51
+
};
52
+
53
+
programs.bat.enable = true;
54
+
55
+
programs.eza = {
56
+
enable = true;
57
+
git = true;
58
+
};
59
+
60
+
programs.fd.enable = true;
61
+
}
+6
home/diogo/system/default.nix
+6
home/diogo/system/default.nix
+29
home/diogo/system/ssh.nix
+29
home/diogo/system/ssh.nix
···
1
+
{
2
+
lib,
3
+
config,
4
+
...
5
+
}:
6
+
{
7
+
programs.ssh = {
8
+
enable = true;
9
+
enableDefaultConfig = false;
10
+
11
+
matchBlocks = {
12
+
"*" = {
13
+
hashKnownHosts = true;
14
+
compression = true;
15
+
identityAgent = lib.mkIf config.sys.profiles.graphical.enable ''"~/Library/Containers/com.bitwarden.desktop/Data/.bitwarden-ssh-agent.sock"'';
16
+
};
17
+
18
+
"codeberg.org" = {
19
+
user = "git";
20
+
hostname = "codeberg.org";
21
+
};
22
+
23
+
"github.com" = {
24
+
user = "git";
25
+
hostname = "github.com";
26
+
};
27
+
};
28
+
};
29
+
}
+17
hosts/default.nix
+17
hosts/default.nix
···
1
+
{ self, inputs, ... }:
2
+
{
3
+
imports = [ inputs.easy-hosts.flakeModule ];
4
+
5
+
config.easy-hosts = {
6
+
perClass = class: {
7
+
modules = [ "${self}/modules/${class}" ];
8
+
};
9
+
10
+
hosts = {
11
+
violet = {
12
+
arch = "aarch64";
13
+
class = "darwin";
14
+
};
15
+
};
16
+
};
17
+
}
+10
hosts/violet/default.nix
+10
hosts/violet/default.nix
+44
justfile
+44
justfile
···
1
+
flake_var := env_var_or_default("FLAKE", "")
2
+
flake := if flake_var =~ '^\.*$' { justfile_directory() } else { flake_var }
3
+
rebuild := if os() == "macos" { "sudo darwin-rebuild" } else { "nixos-rebuild" }
4
+
system-args := if os() != "macos" { "--sudo --no-reexec" } else { "" }
5
+
6
+
[private]
7
+
default:
8
+
@just --list --unsorted
9
+
10
+
[group('rebuild')]
11
+
[private]
12
+
builder goal *args:
13
+
{{ rebuild }} {{ goal }} \
14
+
--flake {{ flake }} \
15
+
{{ system-args }} \
16
+
{{ args }}
17
+
18
+
[group('rebuild')]
19
+
switch *args: (builder "switch" args)
20
+
21
+
[group('rebuild')]
22
+
[macos]
23
+
provision host:
24
+
sudo nix run nix-darwin/master -- switch --flake {{ flake }}#{{ host }}
25
+
26
+
[group('rebuild')]
27
+
deploy host *args: (builder "switch" "--build-host " + host "--target-host " + host "--use-substitutes " + args)
28
+
29
+
[group('utils')]
30
+
clean:
31
+
nix-collect-garbage --delete-older-than 3d
32
+
nix store optimise
33
+
34
+
[group('utils')]
35
+
rotate:
36
+
/usr/bin/find secrets/ -name "*.yaml" | xargs -I {} sops rotate -i {}
37
+
/usr/bin/find secrets/ -name "*.yaml" | xargs -I {} sops updatekeys -y {}
38
+
39
+
[group('utils')]
40
+
update:
41
+
nix flake update \
42
+
--commit-lock-file \
43
+
--commit-lockfile-summary "flake: update inputs" \
44
+
--flake {{ flake }}
+73
modules/darwin/brew.nix
+73
modules/darwin/brew.nix
···
1
+
{
2
+
pkgs,
3
+
inputs,
4
+
config,
5
+
lib,
6
+
...
7
+
}:
8
+
{
9
+
imports = [
10
+
inputs.homebrew.darwinModules.nix-homebrew
11
+
./environment.nix
12
+
];
13
+
14
+
config = {
15
+
nix-homebrew = {
16
+
enable = true;
17
+
taps = {
18
+
"homebrew/homebrew-core" = pkgs.fetchFromGitHub {
19
+
owner = "homebrew";
20
+
repo = "homebrew-core";
21
+
rev = "5b104d8d7a7b36f46d0b401d05b76223e4e563a0";
22
+
hash = "sha256-ounBeVA8dzrZ/K10CIa2zRkCPjGd+nWL6kqpETFAktk=";
23
+
};
24
+
"homebrew/homebrew-cask" = pkgs.fetchFromGitHub {
25
+
owner = "homebrew";
26
+
repo = "homebrew-cask";
27
+
rev = "247fe8e7eac947fd72d620ba30792925af93167d";
28
+
hash = "sha256-WnmrHLadWR1bxWpmcfziY62U5oQkNREweNqE0H5k1fw=";
29
+
};
30
+
};
31
+
mutableTaps = false;
32
+
user = "diogo";
33
+
autoMigrate = true;
34
+
};
35
+
36
+
homebrew = {
37
+
enable = true;
38
+
39
+
global.autoUpdate = true;
40
+
41
+
onActivation = {
42
+
upgrade = true;
43
+
cleanup = "zap";
44
+
};
45
+
46
+
taps = builtins.attrNames config.nix-homebrew.taps;
47
+
48
+
masApps = {
49
+
# "TestFlight" = 899247664;
50
+
# "WhatsApp" = 310633997;
51
+
# "WireGuard" = 1451685025;
52
+
# "Bitwarden" = 1352778147;
53
+
};
54
+
55
+
brews = [
56
+
"bitwarden-cli"
57
+
];
58
+
59
+
casks = [
60
+
"1password"
61
+
"aldente"
62
+
"font-maple-mono"
63
+
"signal"
64
+
"raycast"
65
+
"sketch@beta"
66
+
]
67
+
++ lib.optionals config.sys.profiles.gaming.enable [
68
+
"steam"
69
+
"prismlauncher"
70
+
];
71
+
};
72
+
};
73
+
}
+18
modules/darwin/default.nix
+18
modules/darwin/default.nix
···
1
+
{ inputs, ... }:
2
+
{
3
+
_class = "darwin";
4
+
5
+
system.defaults.CustomUserPreferences."com.apple.AdLib".allowApplePersonalizedAdvertising = false;
6
+
7
+
imports = [
8
+
../shared
9
+
inputs.home-manager.darwinModules.home-manager
10
+
./preferences.nix
11
+
./networking.nix
12
+
./keyboard.nix
13
+
./brew.nix
14
+
./services
15
+
];
16
+
17
+
system.stateVersion = 6;
18
+
}
+9
modules/darwin/environment.nix
+9
modules/darwin/environment.nix
+14
modules/darwin/keyboard.nix
+14
modules/darwin/keyboard.nix
+20
modules/darwin/networking.nix
+20
modules/darwin/networking.nix
···
1
+
{
2
+
networking = {
3
+
applicationFirewall = {
4
+
enable = true;
5
+
blockAllIncoming = false;
6
+
allowSignedApp = false;
7
+
allowSigned = true;
8
+
enableStealthMode = true;
9
+
};
10
+
knownNetworkServices = [
11
+
"Wi-Fi"
12
+
];
13
+
dns = [
14
+
"9.9.9.9"
15
+
"1.1.1.2"
16
+
"2620:fe::fe"
17
+
"2606:4700:4700::1112"
18
+
];
19
+
};
20
+
}
+86
modules/darwin/preferences.nix
+86
modules/darwin/preferences.nix
···
1
+
{
2
+
system.defaults = {
3
+
dock = {
4
+
autohide = true;
5
+
tilesize = 35;
6
+
orientation = "left";
7
+
show-recents = false;
8
+
minimize-to-application = true;
9
+
mru-spaces = false;
10
+
persistent-apps = [
11
+
{
12
+
app = "/nix/store/5f1ghi3sgdpv5m9d8jhi4i3434rqkp7w-zen-beta-1.17.6b/Applications/Zen Browser (Beta).app";
13
+
}
14
+
{ app = "/System/Applications/Mail.app"; }
15
+
{ app = "/nix/store/cb89wc26l0fzaywsr1y8ds0vwsxi9mr0-ghostty-bin-1.2.3/Applications/Ghostty.app"; }
16
+
{ app = "/nix/store/xcwka2yvbvip4lmc1m15gyq99wfwbahn-vesktop-1.6.1/Applications/Vesktop.app"; }
17
+
{ app = "/System/Applications/System Settings.app"; }
18
+
];
19
+
};
20
+
21
+
NSGlobalDomain = {
22
+
AppleShowScrollBars = "WhenScrolling";
23
+
AppleShowAllExtensions = true;
24
+
AppleShowAllFiles = true;
25
+
NSAutomaticQuoteSubstitutionEnabled = false;
26
+
NSAutomaticDashSubstitutionEnabled = false;
27
+
NSAutomaticSpellingCorrectionEnabled = false;
28
+
NSAutomaticCapitalizationEnabled = false;
29
+
NSScrollAnimationEnabled = true;
30
+
};
31
+
32
+
WindowManager = {
33
+
EnableStandardClickToShowDesktop = false;
34
+
};
35
+
36
+
screensaver = {
37
+
askForPassword = true;
38
+
askForPasswordDelay = 0;
39
+
};
40
+
41
+
finder = {
42
+
ShowPathbar = true;
43
+
FXEnableExtensionChangeWarning = false;
44
+
AppleShowAllExtensions = true;
45
+
AppleShowAllFiles = true;
46
+
FXRemoveOldTrashItems = true;
47
+
ShowHardDrivesOnDesktop = true;
48
+
};
49
+
50
+
CustomUserPreferences."com.apple.finder" = {
51
+
ShowExternalHardDrivesOnDesktop = true;
52
+
ShowHardDrivesOnDesktop = true;
53
+
ShowMountedServersOnDesktop = true;
54
+
ShowRemovableMediaOnDesktop = true;
55
+
_FXSortFoldersFirst = true;
56
+
FXDefaultSearchScope = "SCcf";
57
+
WarnOnEmptyTrash = false;
58
+
};
59
+
60
+
loginwindow = {
61
+
GuestEnabled = false;
62
+
SHOWFULLNAME = false;
63
+
};
64
+
65
+
controlcenter = {
66
+
BatteryShowPercentage = true;
67
+
Bluetooth = false;
68
+
Display = false;
69
+
FocusModes = false;
70
+
NowPlaying = false;
71
+
Sound = false;
72
+
};
73
+
};
74
+
75
+
system.activationScripts.postActivate.text = ''
76
+
#!/usr/bin/env bash
77
+
set -e
78
+
79
+
sudo chflags nohidden /Volumes
80
+
chflags nohidden "$HOME/Library"
81
+
sudo dscacheutil -flushcache
82
+
sudo killall -HUP mDNSResponder
83
+
84
+
killall Dock Finder SystemUIServer WindowManager || true
85
+
'';
86
+
}
+76
modules/darwin/services/yabai.nix
+76
modules/darwin/services/yabai.nix
···
1
+
{
2
+
self,
3
+
lib,
4
+
config,
5
+
...
6
+
}:
7
+
let
8
+
inherit (lib) mkIf;
9
+
inherit (self.lib) mkServiceOption;
10
+
11
+
cfg = config.sys.services.yabai;
12
+
in
13
+
{
14
+
options = {
15
+
sys.services.yabai = mkServiceOption "yabai" { };
16
+
};
17
+
18
+
config = mkIf cfg.enable {
19
+
services.yabai = {
20
+
enable = true;
21
+
config = {
22
+
mouse_follows_focus = "on";
23
+
split_ratio = 0.50;
24
+
layout = "bsp";
25
+
top_padding = 8;
26
+
bottom_padding = 8;
27
+
left_padding = 8;
28
+
right_padding = 8;
29
+
window_gap = 8;
30
+
external_bar = "main:0:0";
31
+
};
32
+
extraConfig = ''
33
+
yabai -m space 1 --label web
34
+
yabai -m rule --add app="Zen Browser (Beta)" space=web
35
+
yabai -m rule --add app="Safari" space=web
36
+
37
+
yabai -m space 2 --label dev
38
+
yabai -m rule --add app="Ghostty" space=dev
39
+
yabai -m rule --add app="Xcode" space=dev
40
+
yabai -m rule --add app="Zed" space=dev
41
+
42
+
yabai -m space 3 --label misc --layout stack
43
+
yabai -m rule --add app="Notes" space=misc
44
+
yabai -m rule --add app="Sketch Beta" space=misc
45
+
yabai -m rule --add app="Reminders" space=misc
46
+
47
+
yabai -m space 4 --label stack --layout stack
48
+
yabai -m rule --add app="Vesktop" space=stack
49
+
yabai -m rule --add app="Signal" space=stack
50
+
yabai -m rule --add app="Messages" space=stack
51
+
yabai -m rule --add app="Mail" space=stack
52
+
yabai -m rule --add app="WhatsApp" space=stack
53
+
yabai -m rule --add app="Podcasts" space=stack
54
+
yabai -m rule --add app="Music" space=stack
55
+
yabai -m rule --add app="Steam" space=stack
56
+
57
+
yabai -m rule --add label="System Settings" app="^System Settings$" manage=off
58
+
yabai -m rule --add label="About This Mac" app="^System Information$" title="About This Mac" manage=off
59
+
yabai -m rule --add label="Software Update" title="^Software Update$" manage=off
60
+
yabai -m rule --add label="Safari" app="^Safari$" title="^(General|(Tab|Website|Profile|Extension|Feature Flag)s|AutoFill|Se(arch|curity)|Privacy|Advanced|Developer)$" manage=off
61
+
yabai -m rule --add label="Finder" app="^Finder$" manage=off
62
+
yabai -m rule --add label="App Store" app="^App Store$" manage=off
63
+
yabai -m rule --add label="Activity Monitor" app="^Activity Monitor$" manage=off
64
+
yabai -m rule --add label="Calculator" app="^Calculator$" manage=off
65
+
yabai -m rule --add label="Dictionary" app="^Dictionary$" manage=off
66
+
yabai -m rule --add label="1Password" app="^1Password$" manage=off
67
+
yabai -m rule --add label="Bitwarden" app="^Bitwarden$" manage=off
68
+
yabai -m rule --add label="FaceTime" app="^FaceTime$" manage=off
69
+
70
+
yabai -m signal --add app='^Ghostty$' event=window_created action='yabai -m space --layout bsp'
71
+
yabai -m signal --add app='^Ghostty$' event=window_destroyed action='yabai -m space --layout bsp'
72
+
73
+
'';
74
+
};
75
+
};
76
+
}
+11
modules/home/default.nix
+11
modules/home/default.nix
+5
modules/home/home.nix
+5
modules/home/home.nix
+13
modules/home/profiles.nix
+13
modules/home/profiles.nix
+17
modules/home/secrets.nix
+17
modules/home/secrets.nix
···
1
+
{
2
+
self,
3
+
name,
4
+
config,
5
+
inputs,
6
+
...
7
+
}:
8
+
{
9
+
imports = [ inputs.sops.homeManagerModules.sops ];
10
+
11
+
config = {
12
+
sops = {
13
+
defaultSopsFile = "${self}/secrets/${name}.yaml";
14
+
age.sshKeyPaths = [ "${config.home.homeDirectory}/.ssh/id_ed25519" ];
15
+
};
16
+
};
17
+
}
+24
modules/nixos/default.nix
+24
modules/nixos/default.nix
···
1
+
{ inputs, ... }:
2
+
{
3
+
_class = "nixos";
4
+
5
+
imports = [
6
+
../shared
7
+
inputs.home-manager.nixosModules.home-manager
8
+
./headless.nix
9
+
./networking
10
+
./sudo.nix
11
+
./secrets.nix
12
+
./services
13
+
./users
14
+
];
15
+
16
+
nix = {
17
+
gc.dates = "Mon *-*-* 04:00";
18
+
19
+
optimise = {
20
+
automatic = true;
21
+
dates = [ "04:30" ];
22
+
};
23
+
};
24
+
}
+10
modules/nixos/headless.nix
+10
modules/nixos/headless.nix
+21
modules/nixos/networking/default.nix
+21
modules/nixos/networking/default.nix
···
1
+
{ config, ... }:
2
+
{
3
+
imports = [
4
+
./fail2ban.nix
5
+
./firewall.nix
6
+
./openssh.nix
7
+
];
8
+
9
+
networking = {
10
+
hostId = builtins.substring 0 8 (builtins.hashString "md5" config.networking.hostName);
11
+
12
+
networkmanager.enable = true;
13
+
14
+
nameservers = [
15
+
"9.9.9.9"
16
+
"1.1.1.1"
17
+
"2620:fe::fe"
18
+
"2606:4700:4700::1111"
19
+
];
20
+
};
21
+
}
+19
modules/nixos/networking/fail2ban.nix
+19
modules/nixos/networking/fail2ban.nix
···
1
+
{
2
+
services.fail2ban = {
3
+
enable = true;
4
+
banaction = "iptables-multiport[blocktype=DROP]";
5
+
maxretry = 3;
6
+
ignoreIP = [
7
+
"127.0.0.0/8"
8
+
"10.0.0.0/8"
9
+
"192.168.0.0/16"
10
+
];
11
+
12
+
bantime-increment = {
13
+
enable = true;
14
+
rndtime = "12m";
15
+
multipliers = "4 8 16 32 64 128 256 512 1024 2048";
16
+
maxtime = "192h";
17
+
};
18
+
};
19
+
}
+20
modules/nixos/networking/firewall.nix
+20
modules/nixos/networking/firewall.nix
···
1
+
{ pkgs, config, ... }:
2
+
{
3
+
config = {
4
+
networking.firewall = {
5
+
enable = true;
6
+
package = pkgs.iptables;
7
+
8
+
allowedTCPPorts = [
9
+
80
10
+
443
11
+
];
12
+
allowedUDPPorts = [ ];
13
+
14
+
allowedTCPPortRanges = [ ];
15
+
allowedUDPPortRanges = [ ];
16
+
17
+
allowPing = config.sys.profiles.headless.enable;
18
+
};
19
+
};
20
+
}
+19
modules/nixos/networking/openssh.nix
+19
modules/nixos/networking/openssh.nix
···
1
+
{
2
+
services.openssh = {
3
+
enable = true;
4
+
5
+
settings = {
6
+
PasswordAuthentication = false;
7
+
KbdInteractiveAuthentication = false;
8
+
PermitRootLogin = "no";
9
+
AuthenticationMethods = "publickey";
10
+
PubkeyAuthentication = "yes";
11
+
12
+
ClientAliveCountMax = 5;
13
+
ClientAliveInterval = 60;
14
+
};
15
+
16
+
openFirewall = true;
17
+
ports = [ 22 ];
18
+
};
19
+
}
+11
modules/nixos/secrets.nix
+11
modules/nixos/secrets.nix
+44
modules/nixos/services/caddy.nix
+44
modules/nixos/services/caddy.nix
···
1
+
{
2
+
self,
3
+
lib,
4
+
config,
5
+
...
6
+
}:
7
+
let
8
+
inherit (lib) mkIf;
9
+
inherit (self.lib) mkServiceOption;
10
+
11
+
cfg = config.sys.services.caddy;
12
+
in
13
+
{
14
+
options = {
15
+
sys.services.caddy = mkServiceOption "caddy" {
16
+
domain = "diogo.fi";
17
+
};
18
+
};
19
+
20
+
config = mkIf cfg.enable {
21
+
sops.secrets.bunny = {
22
+
sopsFile = "${self}/secrets/services/bunny.yaml";
23
+
key = "bunny";
24
+
owner = "caddy";
25
+
group = "caddy";
26
+
};
27
+
28
+
networking = { inherit (cfg) domain; };
29
+
30
+
security.acme = {
31
+
acceptTerms = true;
32
+
defaults.email = "hello@${cfg.domain}";
33
+
certs.${cfg.domain} = {
34
+
extraDomainNames = [ "*.${cfg.domain}" ];
35
+
dnsProvider = "bunny";
36
+
credentialsFile = config.sops.secrets.bunny.path;
37
+
};
38
+
};
39
+
40
+
users.users.caddy.extraGroups = [ "acme" ];
41
+
42
+
services.caddy.enable = true;
43
+
};
44
+
}
+7
modules/nixos/services/default.nix
+7
modules/nixos/services/default.nix
+16
modules/nixos/services/docker.nix
+16
modules/nixos/services/docker.nix
···
1
+
{
2
+
lib,
3
+
self,
4
+
config,
5
+
...
6
+
}:
7
+
let
8
+
inherit (lib) mkIf;
9
+
inherit (self.lib) mkServiceOption;
10
+
in
11
+
{
12
+
options.sys.services.docker = mkServiceOption "docker" { };
13
+
config = mkIf config.sys.services.docker.enable {
14
+
virtualisation.docker.enable = true;
15
+
};
16
+
}
+71
modules/nixos/services/pds.nix
+71
modules/nixos/services/pds.nix
···
1
+
# https://isabelroses.com/blog/nix-pds-guide/
2
+
{
3
+
lib,
4
+
self,
5
+
config,
6
+
...
7
+
}:
8
+
let
9
+
inherit (lib) mkIf concatStringsSep;
10
+
inherit (self.lib) mkServiceOption;
11
+
12
+
cfg = config.sys.services.pds;
13
+
in
14
+
{
15
+
options.sys.services.pds = mkServiceOption "pds" {
16
+
domain = "pds.${config.networking.domain}";
17
+
port = 3333;
18
+
};
19
+
20
+
config = mkIf cfg.enable {
21
+
sops.secrets.pds = {
22
+
sopsFile = "${self}/secrets/services/pds.yaml";
23
+
owner = "pds";
24
+
group = "pds";
25
+
};
26
+
27
+
services = {
28
+
bluesky-pds = {
29
+
enable = true;
30
+
pdsadmin.enable = true;
31
+
32
+
environmentFiles = [ config.sops.secrets.pds.path ];
33
+
34
+
settings = {
35
+
PDS_PORT = cfg.port;
36
+
PDS_HOSTNAME = cfg.domain;
37
+
PDS_ADMIN_EMAIL = "hello@" + config.networking.domain;
38
+
39
+
# https://compare.hose.cam
40
+
PDS_CRAWLERS = concatStringsSep "," [
41
+
"https://bsky.network"
42
+
"https://relay.cerulea.blue"
43
+
"https://relay.fire.hose.cam"
44
+
"https://relay2.fire.hose.cam"
45
+
"https://relay3.fr.hose.cam"
46
+
"https://relay.hayescmd.net"
47
+
"https://relay.xero.systems"
48
+
"https://relay.upcloud.world"
49
+
"https://relay.feeds.blue"
50
+
"https://atproto.africa"
51
+
];
52
+
53
+
PDS_OAUTH_PROVIDER_NAME = config.networking.domain;
54
+
};
55
+
};
56
+
57
+
caddy.virtualHosts.${cfg.domain} = {
58
+
extraConfig = ''
59
+
reverse_proxy http://${cfg.host}:${toString cfg.port}
60
+
61
+
handle /xrpc/app.bsky.unspecced.getAgeAssuranceState {
62
+
header content-type "application/json"
63
+
header access-control-allow-headers "authorization,dpop,atproto-accept-labelers,atproto-proxy"
64
+
header access-control-allow-origin "*"
65
+
respond `{"lastInitiatedAt":"2025-07-14T14:22:43.912Z","status":"assured"}` 200
66
+
}
67
+
'';
68
+
};
69
+
};
70
+
};
71
+
}
+10
modules/nixos/sudo.nix
+10
modules/nixos/sudo.nix
+13
modules/nixos/users/diogo.nix
+13
modules/nixos/users/diogo.nix
···
1
+
{
2
+
lib,
3
+
config,
4
+
...
5
+
}:
6
+
let
7
+
inherit (lib) elem mkIf;
8
+
in
9
+
{
10
+
config = mkIf (elem "diogo" config.sys.users) {
11
+
users.users.diogo.hashedPassword = "$6$h/hPw1aKAbw/WKxy$IEnxYGD/esK890EjR5i4TlrDj6ph4DfZpiUdQ2FZp/LqXAkNzSN2BXUlmL4QQWJHsvjlbzIvULeLigfATRzyC.";
12
+
};
13
+
}
+17
secrets/diogo.yaml
+17
secrets/diogo.yaml
···
1
+
uwu: ENC[AES256_GCM,data:icu0,iv:zRILxhD8FDMHam2fKaRGZTucmazwogB53SAmn4Vk7bE=,tag:M7K0E+N/5s11FofKxc//2w==,type:str]
2
+
sops:
3
+
age:
4
+
- recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICCTbCHJ0avif6MQ7izXlHHaubNsOhU2xf9lMvXKLyUQ
5
+
enc: |
6
+
-----BEGIN AGE ENCRYPTED FILE-----
7
+
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IEZnTXFHQSBuOWk5
8
+
ckR4RzMzNkFuc05HSTBBSEwzaFczSUlmY1BqRHp5R25NMndEVEdFClVEK3hMRFcv
9
+
K2ZqQkkraHZWdWJQaVpFYzdSUSt4Mnl6VGdjUnVEVWZRcmsKLS0tIGRIczhvaUk2
10
+
SHRJcjA2MjFLcVVwZTZtUGs0OWZnbzYra0drVzVwT1hjYU0KYf38Vm1666GeDYaA
11
+
ljNh7adAMf6YW80B8e+xtaL4eCNnogdLdmITVduAsxij0k/UloC1ZILF5w9g+lR0
12
+
duLznQ==
13
+
-----END AGE ENCRYPTED FILE-----
14
+
lastmodified: "2025-11-19T14:59:40Z"
15
+
mac: ENC[AES256_GCM,data:J9rjve5UkkZhkHLX828S8EksCnQqHtsAy2/4jOBxSh6uvjG82JlHQ5ok2rcRSAWxHU6I/QvpzqsVJXAd2r60uJyWdNf+gBxIppC+0q5oLL7BB0DVMxzthy60RPKpV0rTy0T1kjHglqXwTb0q6SxyoAhYHLW4ZpD5wXB0qFIC/d4=,iv:FKOjqkVq8mpeyz6RVOTOioJehN2FUb58wNWE77ZnEAo=,tag:ohyZJlug3hC0yFp0HjwbZQ==,type:str]
16
+
unencrypted_suffix: _unencrypted
17
+
version: 3.10.2
+17
secrets/services/bunny.yaml
+17
secrets/services/bunny.yaml
···
1
+
bunny: ENC[AES256_GCM,data:SZlpwyvlWNCCV0Q0VEop8MUg/pSlDdWPGC/EfPiX2dEq+LA8iB0mV3QgJlX/eJEJrjSkIU1Wk8TN5Cjc7N54CnUk+1aYgnxGwUu1vbrep8TodKpxDSNR,iv:9irGAPMiQcHHpcjo+Ho660oiyAV4PdJnzsZEhpAmQ8k=,tag:mCpQvv3wMYNb8n1Rwi6TiA==,type:str]
2
+
sops:
3
+
age:
4
+
- recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICCTbCHJ0avif6MQ7izXlHHaubNsOhU2xf9lMvXKLyUQ
5
+
enc: |
6
+
-----BEGIN AGE ENCRYPTED FILE-----
7
+
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IEZnTXFHQSBqOURG
8
+
eXlNaitjYUcydkdaRlRLK1NGeDIvcnpBR2VkbGZHR3ZxSGhDd0c0CjBtU1JMc0ZK
9
+
YzBwVm9LTHZkcTR6elFNcDMvTHgxTlJrNDlwSmtGNUNzU28KLS0tIEMraXYvMUFu
10
+
d0JUcXMzL0liY3RZNEsrNTRWUE4vUWtwOERmMHZFc2gwWWMKSAaqC1tzow+dgUlS
11
+
9IHX8AxaX6bmWsoaU5+/+0gOmFkjvvfp2bb0/dd6eHtgJJWXgaw85jsD0v55wOb/
12
+
U+qB8Q==
13
+
-----END AGE ENCRYPTED FILE-----
14
+
lastmodified: "2025-11-19T14:59:40Z"
15
+
mac: ENC[AES256_GCM,data:AiBNKPGULJfY20YgoJIy8Y9OTOaq9cSjnnMOIIGLHl7Db3Fa73ft7mgSxwR35tVP+F7UdxFNOnUXjewh0AigodgEYtGfGGgoI97/KKPiW9u5T9/RGVKw3MdBwHjxkanZdOw8u52n23DvvEqKsDwefoQslzBZpnA9V8V7hIaruH0=,iv:lb/P/XACYgX9PhMF7Sd+pEg4nG7KYZv1e5pXviyDTAs=,tag:9QNB4Ujgj81vwKJCA8qFcg==,type:str]
16
+
unencrypted_suffix: _unencrypted
17
+
version: 3.11.0
+17
secrets/services/pds.yaml
+17
secrets/services/pds.yaml
···
1
+
pds: ENC[AES256_GCM,data:x/WhLcfbMCcrGjpsmebR2upQQN3A6/7Q8EvGruN3HKi1YdWY6rYNP8I7/hz0atRMm5DyU6kvWPaaDZgSmxVfLb820ZMRl7EExI9XH+7MnvSuosbVOMhnZ7YbjraL7yZZNd8/5oCYPXX6BKyuLvKuWgycXlMFMfPb+7gFOMu8hNv+EzYSHKYbrjSj3ZC1vpiVfderCrW1iJWZaR4YHcQQtxQVds4o17yb2yNGaXrngpCxb8JLkSmDgHqfiDWXAMV27/0aagrwQL/crTmHFskyWQVlPchG39bF+Dt5H06ifJZGSV3jXsKVxCldZTxhYHEMrU6eHQVVEIawHvjixJLLipy3jO28wK6k7zGCPKFCeKZA9GEwMdR5Y7BQ7kG3YfKFbRpXtz73yL/E36FSL3r2frFyTHi4slYEcO/A1noqxpP26zibFFHl8TA=,iv:bC9e4zNogCZRsVD9roa+YkTEFH0YGvhNIdLZPi955JM=,tag:EJbh+3uSevdRlr7N3PupWg==,type:str]
2
+
sops:
3
+
age:
4
+
- recipient: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICCTbCHJ0avif6MQ7izXlHHaubNsOhU2xf9lMvXKLyUQ
5
+
enc: |
6
+
-----BEGIN AGE ENCRYPTED FILE-----
7
+
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IEZnTXFHQSA5dHN3
8
+
UFNFdWFrTUxnQzdZdkdqSDhOT0FmSzQ1eFhiUnkyT2U5NnNGSXljCnNzYnJyMHJv
9
+
WXVxam5rTVZiRmNwRFRSMTNJbHVDYy95dlhvSzdUdmRVelkKLS0tIDF3Ulc0TkZM
10
+
Mmc2dUoxUDNRTE84SEVoakxvVUlnY3k0N3JEZHhlcUpoODAK9KTcrjauhWLVHExY
11
+
na54ehUSBCXmFwv0pUhNXVBmY1o7bmWcxqoYjVAfvqrMHAWCMYinEvcVN+EzY8fB
12
+
XXfPmg==
13
+
-----END AGE ENCRYPTED FILE-----
14
+
lastmodified: "2025-11-19T14:59:40Z"
15
+
mac: ENC[AES256_GCM,data:Hsd21Z896TSmeJ/0ufX1grzAdnk11odYjg2T9qvkZ8OQyPY7+17tEUcd6R2GyLC5TsMxqoLWR21iFN+nHR0Z0RVlpElQtC2/vTUdOLLbUW2eeZfBCMYwxWJKxlUQiOM2rRADpIhNmbPqB53n8i4idqUVKw5kC19+zGTT+BixROE=,iv:/OjthGKQQEI5mToTtlzMZulWpuj45j6XxkFCEgxQNM8=,tag:Wr+M9P4qg7/IbKW5id2sjQ==,type:str]
16
+
unencrypted_suffix: _unencrypted
17
+
version: 3.11.0