Compare commits
196
Commits
master
..
a1b8bc9555
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a1b8bc9555
|
||
|
|
83ffca5e21
|
||
|
|
eb782a67cb
|
||
|
|
85a12edbcc
|
||
|
|
a056e4d98b
|
||
|
|
5f17a04fbb
|
||
|
|
f514387f64
|
||
|
|
c328c188b8
|
||
|
|
585f74ce0f
|
||
|
|
8263fe01eb
|
||
|
|
d61e6f8b9c
|
||
|
|
7c7c195083
|
||
|
|
2e78898c5a
|
||
|
|
1f61e9958c
|
||
|
|
c8954e5854
|
||
|
|
e772d93f23
|
||
|
|
4c17560020
|
||
|
|
e1542a1168
|
||
|
|
a351bf59ba
|
||
|
|
7a62f38084
|
||
|
|
b50c5f9f71
|
||
|
|
0087145957
|
||
|
|
48c77e9654
|
||
|
|
71d06d61b1
|
||
|
|
75d024111e
|
||
|
|
b67aee2a64
|
||
|
|
554a76b585
|
||
|
|
d9e7e315da
|
||
|
|
daee8da3ae
|
||
|
|
c2b661adbb
|
||
|
|
aa4ebfbc06
|
||
|
|
db850552e3
|
||
|
|
63afac3d04
|
||
|
|
645fc64ead
|
||
|
|
6561d4c979
|
||
|
|
f1ed339968
|
||
|
|
50d14ecf83
|
||
|
|
1cdc3f25e0
|
||
|
|
9e62f755bb
|
||
|
|
d0e6fe072a
|
||
|
|
86ea11c8e8
|
||
|
|
1adacf5e1e
|
||
|
|
e53787deae
|
||
|
|
efce5c6293
|
||
|
|
6069a12e64
|
||
|
|
91bd79a051
|
||
|
|
9bec5f42b1
|
||
|
|
602aa4cd56
|
||
|
|
3573a705af
|
||
|
|
615d886a98
|
||
|
|
4416f39f0c
|
||
|
|
0bb481c037
|
||
|
|
98a3788f4f
|
||
|
|
ac4b005f9b
|
||
|
|
901f58a527
|
||
|
|
9a5bc3e981
|
||
|
|
fe69d39769
|
||
|
|
2f675e96f0
|
||
|
|
56512194ef
|
||
|
|
d1a6aafed5
|
||
|
|
6305d9ca2e
|
||
|
|
887f7db0c7
|
||
|
|
d8dbdbc5de
|
||
|
|
4014ed0318
|
||
|
|
87fa954937
|
||
|
|
934644c5e2
|
||
|
|
0bda035ccd
|
||
|
|
6e999ffa02
|
||
|
|
807388d032
|
||
|
|
9b1a7c73e6
|
||
|
|
da729f8c22
|
||
|
|
d08d795adf
|
||
|
|
ffc2516353
|
||
|
|
135e1e5701
|
||
|
|
5b2fc78889
|
||
|
|
4cbe9885b2
|
||
|
|
9b43074248
|
||
|
|
be3f6baa17
|
||
|
|
837233b552
|
||
|
|
ca0c718f3b
|
||
|
|
3c68574aea
|
||
|
|
aa668d04d3
|
||
|
|
d16b645078
|
||
|
|
b71264b864
|
||
|
|
6ed1882429
|
||
|
|
952802d4f7
|
||
|
|
53fc6eedc8
|
||
|
|
2e0f378c9e
|
||
|
|
abab1cf2b4
|
||
|
|
ad3210f150
|
||
|
|
afe74b8fa1
|
||
|
|
8f5a9d753f
|
||
|
|
d45a9946bb
|
||
|
|
c0f8356205
|
||
|
|
72a8dcb8d5
|
||
|
|
da548f10bb
|
||
|
|
9bfbbc0dc9
|
||
|
|
26ac3a8e02
|
||
|
|
632fcc3dab
|
||
|
|
a204951964
|
||
|
|
9aea533693
|
||
|
|
a07499813d
|
||
|
|
6e2a64a50c
|
||
|
|
80d932838f
|
||
|
|
4bed2e7021
|
||
|
|
75ffcc5c6e
|
||
|
|
cb14d79586
|
||
|
|
9b41d5552e
|
||
|
|
3d50b8fea7
|
||
|
|
5aec2aa971
|
||
|
|
b799d86823
|
||
|
|
d505394753
|
||
|
|
06cf86fa20
|
||
|
|
a4272ea92c
|
||
|
|
89739e3af0
|
||
|
|
52a99db8e0
|
||
|
|
7848fb7274
|
||
|
|
397d1b014c
|
||
|
|
7f1ce57994
|
||
|
|
a1f495f138
|
||
|
|
4e9003e0c5
|
||
|
|
380e11edb2
|
||
|
|
a2153c4418
|
||
|
|
abdcbe2ce9
|
||
|
|
fa286dce16
|
||
|
|
c4454daab6
|
||
|
|
a03c9d8227
|
||
|
|
9db5d91da6
|
||
|
|
72716230ea
|
||
|
|
2919e797ed
|
||
|
|
86d669c2ab
|
||
|
|
77ac5b70b8
|
||
|
|
54839be395
|
||
|
|
714e3e0683
|
||
|
|
a8d7d1e666
|
||
|
|
40bcc14304
|
||
|
|
fa5bd0eefd
|
||
|
|
6182ada581
|
||
|
|
4acddcec09
|
||
|
|
5c14817464
|
||
|
|
38920bd3d7
|
||
|
|
b89934d13f
|
||
|
|
734dfcadfc
|
||
|
|
2c959fdc0c
|
||
|
|
e00c4f49f5
|
||
|
|
61131ca598
|
||
|
|
9c1a39d699
|
||
|
|
32de6e24b7
|
||
|
|
78e554cc30
|
||
|
|
f65617deed
|
||
|
|
aa3a881d58
|
||
|
|
7f99b73635
|
||
|
|
c1360e5c2c
|
||
|
|
ca9e66bc35
|
||
|
|
eac705bdfb
|
||
|
|
69beab4812
|
||
|
|
515110ff7d
|
||
|
|
9a9bffd637
|
||
|
|
f1b269e3ee
|
||
|
|
f09dee5ad8
|
||
|
|
f246eacdb3
|
||
|
|
b7e2bba8f0
|
||
|
|
25ae0f4b85
|
||
|
|
d12b247368
|
||
|
|
25e9128875
|
||
|
|
eee28f57fc
|
||
|
|
ea03e2266f
|
||
|
|
5e422d05c9
|
||
|
|
eaa36cfce2
|
||
|
|
572d0bfe9e
|
||
|
|
385ca27f8c
|
||
|
|
4c18fd8c8e
|
||
|
|
bf0c55669c
|
||
|
|
86a5e79079
|
||
|
|
7d429a4720
|
||
|
|
2e9a4b13d1
|
||
|
|
73eeff9a0e
|
||
|
|
d216a8018d
|
||
|
|
b09d854e50
|
||
|
|
ff39dd1df2
|
||
|
|
98c520e0bd
|
||
|
|
7e3d3ca4a5
|
||
|
|
c8a76751f3
|
||
|
|
12a10bee82
|
||
|
|
767309885a
|
||
|
|
6d360ed782
|
||
|
|
ddccd51b5a
|
||
|
|
1fef42e5d4
|
||
|
|
0d20883f4f
|
||
|
|
cec5ec5493
|
||
|
|
5833dff19e
|
||
|
|
7b4c2df7af
|
||
|
|
1643f30906
|
||
|
|
79c617cc91
|
||
|
|
474a8badf4
|
||
|
|
17368396cf
|
@@ -1,128 +0,0 @@
|
||||
# AGENTS.md
|
||||
|
||||
## Common Commands
|
||||
|
||||
```bash
|
||||
# Enter the dev shell (provides helper utilities)
|
||||
nix develop
|
||||
|
||||
# Preferred shorthand (nh must be enabled in config)
|
||||
nh os switch # rebuild and switch
|
||||
nh os boot # new boot entry without switching
|
||||
|
||||
# Direct nixos-rebuild (fallback)
|
||||
sudo nixos-rebuild switch --flake .#nixinator
|
||||
sudo nixos-rebuild switch --flake .#nixtop
|
||||
sudo nixos-rebuild switch --flake .#servenix
|
||||
sudo nixos-rebuild switch --flake .#thinknix
|
||||
sudo darwin-rebuild switch --flake .#darwinix
|
||||
|
||||
# Validate flake without building
|
||||
nix flake check
|
||||
|
||||
# Dev shell helpers (run inside `nix develop`)
|
||||
list-system-packages # show installed system packages
|
||||
list-user-packages # show installed user packages
|
||||
store-optimise # nix store --optimise
|
||||
store-verify # nix store --verify --repair
|
||||
```
|
||||
|
||||
## MCP Tools
|
||||
|
||||
The **nixos** MCP server is available and should be used for any Nix-related lookups instead of `nix search` or manual web searches. It queries live APIs (search.nixos.org, NixHub, FlakeHub) and is more current than training data.
|
||||
|
||||
```
|
||||
# Common intents
|
||||
nix {"action":"info","query":"<pkg>","channel":"unstable"} # package info
|
||||
nix {"action":"search","query":"<term>","type":"options"} # NixOS options
|
||||
nix {"action":"search","source":"home-manager","query":"<term>"} # HM options
|
||||
nix {"action":"cache","query":"<pkg>"} # binary cache status
|
||||
nix_versions {"package":"<attr>","version":"<ver>"} # commit that shipped a version
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
This is a multi-host NixOS/nix-darwin flake. Home-manager runs **as a NixOS module** — not standalone. A single `nixos-rebuild switch` rebuilds system and user config together. The HM config can access the system config via the `nixosConfig` special arg.
|
||||
|
||||
### Hosts
|
||||
|
||||
| Host | Type | Notes |
|
||||
|------|------|-------|
|
||||
| `nixinator` | Desktop (x86_64) | Primary machine; disko, lanzaboote, impermanence |
|
||||
| `nixtop` | Laptop (x86_64) | Intel GPU, NetworkManager |
|
||||
| `servenix` | Server (x86_64) | Headless; runs OCI container services |
|
||||
| `thinknix` | Headless (x86_64) | Generic headless config |
|
||||
| `darwinix` | macOS (aarch64) | Darwin-specific configuration |
|
||||
|
||||
### Config Layering (resolved in this order)
|
||||
|
||||
1. **Global defaults** — `system/default.nix` / `home/christoph/default.nix`
|
||||
2. **Host overrides** — `system/<hostname>/default.nix` / `home/christoph/<hostname>/default.nix`
|
||||
3. **Hardware** — `system/<hostname>/hardware-configuration.nix` (auto-generated, **do not hand-edit**)
|
||||
|
||||
The builder (`lib/nixos.nix`: `mkNixosConfigWithHomeManagerModule`) wires these together.
|
||||
|
||||
### Special Args
|
||||
|
||||
Injected into **all system and HM modules**:
|
||||
`inputs` `system` `hostname` `mylib` `username` `publicKeys` `headless`
|
||||
|
||||
Use `headless` (boolean) to gate anything graphical. Use `mylib.<fn>` instead of reimplementing helpers.
|
||||
|
||||
### Module System
|
||||
|
||||
Two parallel hierarchies, identical pattern:
|
||||
|
||||
| Scope | Path | Option prefix |
|
||||
|-------|------|---------------|
|
||||
| System | `system/systemmodules/<name>/` | `systemmodules.<name>.*` |
|
||||
| Home-manager | `home/homemodules/<name>/` | `homemodules.<name>.*` |
|
||||
|
||||
**System modules** — `system/systemmodules/<name>/`
|
||||
- `options.nix` — declares `systemmodules.<name>.*` options
|
||||
- `default.nix` — imports `./options.nix`, implements `lib.mkIf <name>.enable { ... }`
|
||||
|
||||
**Home-manager modules** — `home/homemodules/<name>/`
|
||||
- `options.nix` — declares `homemodules.<name>.*` options
|
||||
- `default.nix` — same pattern under `homemodules.*`
|
||||
|
||||
When adding a new module, copy from `0_template/` in either hierarchy. Modules under `1_deprecated/` are kept for reference only — not imported anywhere.
|
||||
|
||||
HM modules are placed in `home-manager.sharedModules` (not `users.<user>.imports`) — this enables proper nixd completions.
|
||||
|
||||
### Custom Library (`lib/`)
|
||||
|
||||
Always available as `mylib`. Key files:
|
||||
- `nixos.nix` — host config builders, `mkNixosConfigWithHomeManagerModule`, `mkDarwinConfigWithHomeManagerModule`
|
||||
- `modules.nix` — `mkBoolOption`, `mkElse`, `attrName`, `attrValue`, `contains`
|
||||
- `networking.nix` — `mkSystemdNetwork`, `mkStaticSystemdNetwork`
|
||||
- `generators.nix` — `toLuaObject`, `toLuaKeymap` (used by Neovim module)
|
||||
- `containers.nix` — OCI container helpers for services
|
||||
- `color.nix` — theming
|
||||
|
||||
Always use `mylib.<fn>` (available as a special arg) rather than reimplementing these utilities.
|
||||
|
||||
### Services
|
||||
|
||||
Server services are OCI containers (podman/docker) defined in `system/services/`. Each file defines one or more containers. These are only enabled on `servenix`. Use the template at `system/services/0_TEMPLATE.nix`.
|
||||
|
||||
### Secrets
|
||||
|
||||
Managed via **sops-nix**. Age keys stored in `flake.nix` under `publicKeys.christoph`. Encrypted `.yaml`/`.json` files live alongside the module that uses them, referenced as `sops.secrets.<name>`.
|
||||
|
||||
### Overlays and Custom Derivations
|
||||
|
||||
- `overlays/default.nix` — package overrides (e.g., patched JetBrains CLion version)
|
||||
- `derivations/default.nix` — custom packages: `monolisa`, `msty`, `unityhub`, `tidal-dl-ng`, `tiddl`
|
||||
- `derivations/1_deprecated/` — kept for reference, not imported
|
||||
|
||||
### Sub-projects
|
||||
|
||||
`config/flake.nix` is a separate, reusable development-project template — **not part of the main NixOS flake**. It uses `flake-utils` for multi-system shells.
|
||||
|
||||
## Constraints
|
||||
|
||||
- No CI, no tests, no linting — this is a configuration repo
|
||||
- `nix flake check` is the only validation available
|
||||
- `documentation.enable = false` by default (slow); toggle it if you need man pages
|
||||
- Hardware config files are auto-generated — never edit them by hand
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 2.6 MiB |
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 747 KiB |
@@ -1,159 +1,43 @@
|
||||
# NixFlake
|
||||
# NixOS Configuration
|
||||
|
||||
NixOS flake with [Niri](https://github.com/niri-wm/niri), [Waybar](https://github.com/Alexays/Waybar) for a lightweight desktop and [home-manager](https://github.com/nix-community/home-manager) for declarative `~/` configuration.
|
||||
Modular NixOS configuration, using [Niri](https://github.com/niri-wm/niri) and [Waybar](https://github.com/Alexays/Waybar) for a light desktop.
|
||||
|
||||
## Screenshots
|
||||

|
||||

|
||||
|
||||

|
||||
To install, run `nixos-rebuild` with the `--flake` parameter from the `NixFlake` directory: `nixos-rebuild switch --flake .#nixinator`.
|
||||
Alternatively, use `nh os switch` or `nh os boot`.
|
||||
|
||||

|
||||
## NixFlake/system
|
||||
|
||||

|
||||
Contains all the system configurations.
|
||||
|
||||
## Hosts
|
||||
- There is a common configuration used for all systems: `NixFlake/system/default.nix`
|
||||
- Every system has its own special configuration: `NixFlake/system/<hostname>/default.nix`
|
||||
- System modules are located in `NixFlake/system/systemmodules`
|
||||
- Hosted services are located in `NixFlake/system/services`
|
||||
|
||||
| Host | Type | GPU | Features |
|
||||
|-|-|-|-|
|
||||
| `nixinator` | Desktop (x86_64) | NVIDIA | [disko](https://github.com/nix-community/disko) partitioning, [lanzaboote](https://github.com/nix-community/lanzaboote) Secure Boot, [impermanence](https://github.com/nix-community/impermanence) opt-in state, [sops-nix](https://github.com/Mic92/sops-nix) secrets |
|
||||
| `nixtop` | Laptop (x86_64) | Intel | Obsolete trash computer |
|
||||
| `servenix` | Headless (x86_64) | NVIDIA | Jellyfin, Nextcloud, Gitea, ... |
|
||||
| `thinknix` | Headless (x86_64) | - | AdGuard DNS, Nginx, ... |
|
||||
| `darwinix` | macOS (aarch64) | - | nix-darwin with home-manager |
|
||||
When creating a NixOS configuration inside the `NixFlake/flake.nix` the common configuration is imported.
|
||||
Because the hostname is propagated to the common configuration, it can import the host-specific config by itself.
|
||||
|
||||
## Usage
|
||||
## NixFlake/home
|
||||
|
||||
```bash
|
||||
# Enter dev shell (provides helper utilities)
|
||||
nix develop
|
||||
Contains all the home-manager configurations.
|
||||
|
||||
# Rebuild system + user config together
|
||||
nh os switch
|
||||
nh os boot
|
||||
- There is a common configuration for each user: `NixFlake/home/<username>/default.nix`
|
||||
- There is a configuration for a single system of this user: `NixFlake/home/<username>/<hostname>/default.nix`
|
||||
- Home-Manager modules are located in `NixFlake/home/homemodules`
|
||||
|
||||
# Or with nixos-rebuild
|
||||
sudo nixos-rebuild switch --flake .#nixinator
|
||||
```
|
||||
When creating a NixOS configuration inside the `NixFlake/flake.nix` the common configuration is imported.
|
||||
Because the hostname is propagated to the common configuration, it can import the host-specific config by itself.
|
||||
|
||||
## Info
|
||||
## NixFlake/derivations
|
||||
|
||||
Home-manager runs as a NixOS module (not standalone). A single `nixos-rebuild switch` rebuilds both system and user configuration together.
|
||||
Contains all the stuff I packaged.
|
||||
Each derivation is loaded into `NixFlake/derivations/default.nix`.
|
||||
|
||||
### Components
|
||||
## NixFlake/overlays
|
||||
|
||||
Per-host config consists of three layers:
|
||||
|
||||
1. **Common Config**: `system/default.nix` (NixOS) / `home/christoph/default.nix` (home-manager)
|
||||
2. **Host Config**: `system/<hostname>/default.nix` (NixOS) / `home/christoph/<hostname>/default.nix` (home-manager)
|
||||
3. **Hardware**: `system/<hostname>/hardware-configuration.nix`
|
||||
|
||||
### Modules
|
||||
|
||||
There are two module hierarchies (NixOS and home-manager modules):
|
||||
|
||||
```
|
||||
system/systemmodules/<name>/ home/homemodules/<name>/
|
||||
- options.nix # declares options - options.nix # declares options
|
||||
- default.nix # implementation - default.nix # implementation
|
||||
```
|
||||
|
||||
## Files
|
||||
|
||||
```
|
||||
NixFlake/
|
||||
├── flake.nix # flake entrypoint: inputs, outputs, host definitions
|
||||
├── flake.lock # flake lockfile
|
||||
├── shell.nix # dev shell (nix develop)
|
||||
├── system/ # NixOS system configurations
|
||||
│ ├── default.nix # global system defaults (all hosts)
|
||||
│ ├── <hostname>/ # per-host overrides + hardware-config
|
||||
│ ├── systemmodules/ # reusable system modules
|
||||
│ └── services/ # OCI container services
|
||||
├── home/ # home-manager user configuration
|
||||
│ └── christoph/
|
||||
│ ├── default.nix # global user defaults
|
||||
│ ├── <hostname>/ # per-host user overrides
|
||||
│ └── homemodules/ # reusable home-manager modules
|
||||
├── lib/ # shared helpers
|
||||
├── derivations/ # custom packages
|
||||
├── overlays/ # package overrides
|
||||
├── config/ # linked dotfiles
|
||||
└── wallpapers/ # backgrounds
|
||||
```
|
||||
|
||||
## System Modules
|
||||
|
||||
| Module | Description |
|
||||
|--------|-------------|
|
||||
| `bootloader` | systemd-boot, lanzaboote Secure Boot signing |
|
||||
| `desktopportal` | xdg-desktop-portal backends (Niri, GTK) |
|
||||
| `docker` | Docker / podman daemon config |
|
||||
| `fonts` | System fonts and fontconfig |
|
||||
| `impermanence` | Opt-in state persistence (wipes `/` on boot) |
|
||||
| `mime` | MIME type associations |
|
||||
| `network` | systemd-networkd wired/wireless config |
|
||||
| `polkit` | Polkit rules for desktop users |
|
||||
| `sops-nix` | Secrets decryption at boot |
|
||||
|
||||
## Home-Manager Modules
|
||||
|
||||
### Shell & Terminal
|
||||
`fish` `terminal` `kitty` `tmux` `paths`
|
||||
|
||||
### Editors
|
||||
`neovim` `vscode` `zed`
|
||||
|
||||
### Desktop / WM
|
||||
`niri` `waybar` `rofi` `color` `fcitx`
|
||||
|
||||
### Media
|
||||
`mpd` `rmpc` `cava` `beets` `jellyfin-tui`
|
||||
|
||||
### Browsers
|
||||
`firefox` `qutebrowser`
|
||||
|
||||
### Tools
|
||||
`git` `ssh` `bat` `btop` `fastfetch` `lazygit` `yazi` `zathura`
|
||||
|
||||
## Services
|
||||
|
||||
All server services run as OCI containers (podman). Each service is defined in `system/services/<name>.nix`.
|
||||
|
||||
| Service | Purpose |
|
||||
|---------|---------|
|
||||
| `adguard` | DNS ad blocking |
|
||||
| `authelia` | SSO |
|
||||
| `fileflows` | Media processing |
|
||||
| `gitea` | Git server |
|
||||
| `immich` | Photo cloud |
|
||||
| `jellyfin` | Streaming server |
|
||||
| `kiwix` | Offline mirrors |
|
||||
| `kopia` | Docker volume backup |
|
||||
| `nextcloud` | File sync |
|
||||
| `nginx-proxy-manager` | Reverse proxy with Let's Encrypt |
|
||||
| `ntfy` | Push notification server |
|
||||
| `paperless` | Document management |
|
||||
| `portainer` | Container status monitor |
|
||||
| `teamspeak` | Voice chat server |
|
||||
| `tinymediamanager` | Media metadata management |
|
||||
|
||||
## Overlays
|
||||
|
||||
Package modifications live in `overlays/default.nix`.
|
||||
|
||||
## Secrets
|
||||
|
||||
Secrets are managed with sops-nix. Public age keys are stored in `flake.nix` under `publicKeys`. Encrypted `.yaml`/`.json` files are referenced via `sops.secrets.<name>`. Decryption happens at activation time.
|
||||
|
||||
## Shared Helpers (`lib/`)
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `nixos.nix` | Host config builders (NixOS + darwin) |
|
||||
| `modules.nix` | Option helpers |
|
||||
| `networking.nix` | systemd-networkd config generators |
|
||||
| `generators.nix` | Lua code generation |
|
||||
| `containers.nix` | OCI container helpers for services |
|
||||
| `color.nix` | Color utilities |
|
||||
| `rofi.nix` | Rofi menu helpers |
|
||||
|
||||
Available to all modules as `mylib` (injected via special args).
|
||||
Contains all overlays, e.g. package version overrides.
|
||||
The `NixFlake/overlays/default.nix` imports all overlays and all derivations.
|
||||
It is then imported by the top-level `NixFlake/flake.nix`, to make everything available to the system/home configurations.
|
||||
|
||||
+18
-45
@@ -98,65 +98,38 @@ rec {
|
||||
buildDebug = mkBuildScript "Debug";
|
||||
buildRelease = mkBuildScript "Release";
|
||||
|
||||
# Add project-local fish abbrs here
|
||||
abbrs = {
|
||||
# Use this to specify commands that should be ran after entering fish shell
|
||||
initProjectShell = pkgs.writers.writeFish "init-shell.fish" ''
|
||||
echo "Entering \"${description}\" environment..."
|
||||
|
||||
# Determine the project root, used e.g. in cmake scripts
|
||||
set -g -x FLAKE_PROJECT_ROOT (git rev-parse --show-toplevel)
|
||||
|
||||
# Rust Bevy:
|
||||
# build-release-windows = "CARGO_FEATURE_PURE=1 cargo xwin build --release --target x86_64-pc-windows-msvc";
|
||||
# abbr -a build-release-windows "CARGO_FEATURE_PURE=1 cargo xwin build --release --target x86_64-pc-windows-msvc"
|
||||
|
||||
# C/C++:
|
||||
# cmake-debug = "${cmakeDebug}";
|
||||
# cmake-release = "${cmakeRelease}";
|
||||
# build-debug = "${buildDebug}";
|
||||
# build-release = "${buildRelease}";
|
||||
# abbr -a cmake-debug "${cmakeDebug}"
|
||||
# abbr -a cmake-release "${cmakeRelease}"
|
||||
# abbr -a build-debug "${buildDebug}"
|
||||
# abbr -a build-release "${buildRelease}"
|
||||
|
||||
# Clojure:
|
||||
# clojure-deps = "deps-lock --lein";
|
||||
# abbr -a clojure-deps "deps-lock --lein"
|
||||
|
||||
# Python:
|
||||
# run = "python ./app/main.py";
|
||||
# profile = "py-spy record -o profile.svg -- python ./app/main.py && firefox profile.svg";
|
||||
# ptop = "py-spy top -- python ./app/main.py";
|
||||
};
|
||||
|
||||
eraseAbbr = name: value: ''abbr --erase ${name} 2>/dev/null'';
|
||||
createAbbr = name: value: ''abbr -a ${name} "${value}"'';
|
||||
|
||||
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets unset
|
||||
unloadProjectShell = pkgs.writers.writeFish "unload-shell.fish" ''
|
||||
echo "Unloading \"${description}\" environment..."
|
||||
|
||||
${builtins.concatStringsSep "\n" (lib.mapAttrsToList eraseAbbr abbrs)}
|
||||
'';
|
||||
|
||||
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets set
|
||||
initProjectShell = pkgs.writers.writeFish "init-shell.fish" ''
|
||||
# Unload just in case, to not have redefinition errors
|
||||
source ${unloadProjectShell}
|
||||
|
||||
echo "Sourcing \"${description}\" environment..."
|
||||
|
||||
${builtins.concatStringsSep "\n" (lib.mapAttrsToList createAbbr abbrs)}
|
||||
# abbr -a run "python ./app/main.py"
|
||||
# abbr -a profile "py-spy record -o profile.svg -- python ./app/main.py && firefox profile.svg"
|
||||
# abbr -a ptop "py-spy top -- python ./app/main.py"
|
||||
'';
|
||||
in
|
||||
builtins.concatStringsSep "\n" [
|
||||
# Launch into pure fish shell
|
||||
''
|
||||
# Determine the project root, used e.g. in cmake scripts
|
||||
export FLAKE_PROJECT_ROOT="$(git rev-parse --show-toplevel)"
|
||||
|
||||
# Can't do the "exec" with nix-direnv
|
||||
# - The "exec fish" would call direnv again => Infinite loop
|
||||
# - The shellHook is Bash/POSIX, so fish syntax doesn't work
|
||||
|
||||
# Use this for "nix develop" without direnv
|
||||
# exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'"
|
||||
|
||||
# Use this for direnv without "nix develop"
|
||||
export INIT_PROJECT_SHELL="${initProjectShell}"
|
||||
export UNLOAD_PROJECT_SHELL="${unloadProjectShell}"
|
||||
exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'"
|
||||
''
|
||||
|
||||
# Qt: Launch into wrapped fish shell (direnv incompatible)
|
||||
# Qt: Launch into wrapped fish shell
|
||||
# https://nixos.org/manual/nixpkgs/stable/#sec-language-qt
|
||||
# ''
|
||||
# fishdir=$(mktemp -d)
|
||||
|
||||
@@ -356,7 +356,7 @@ background_alpha=0.8
|
||||
################ INTERACTION #################
|
||||
|
||||
### Change toggle keybinds for the hud & logging
|
||||
toggle_hud=Shift_R+F12
|
||||
# toggle_hud=Shift_R+F12
|
||||
# toggle_hud_position=Shift_R+F11
|
||||
# toggle_preset=Shift_R+F10
|
||||
# toggle_fps_limit=Shift_L+F1
|
||||
|
||||
@@ -206,12 +206,12 @@ dos2unix <file>
|
||||
$ file: eza -1
|
||||
|
||||
% unix2dos
|
||||
# Convert line endings to dos format
|
||||
Convert line endings to dos format
|
||||
unix2dos <file>
|
||||
$ file: eza -1
|
||||
|
||||
% tiddl
|
||||
# Download stuff from tidal
|
||||
Download stuff from tidal
|
||||
tiddl download --track-quality max --path ~/Downloads/Beet/Albums --videos none url "<url>"
|
||||
|
||||
; ===========================
|
||||
@@ -238,11 +238,11 @@ $ mode: echo -e "--export \tExport public key\n--export-secret-keys\t
|
||||
|
||||
% sops
|
||||
# Edit secrets.yaml
|
||||
sops ~/NixFlake/system/systemmodules/sops-nix/secrets.yaml
|
||||
sops ~/NixFlake/system/modules/sops-nix/secrets.yaml
|
||||
|
||||
% sops
|
||||
# Rekey secrets.yaml
|
||||
sops updatekeys ~/NixFlake/system/systemmodules/sops-nix/secrets.yaml
|
||||
sops updatekeys ~/NixFlake/system/modules/sops-nix/secrets.yaml
|
||||
|
||||
% ssh
|
||||
# Generate a new SSH key
|
||||
@@ -308,33 +308,27 @@ mkdir -p "<name>" && cd "<name>" && spotdl --client-id (cat /home/christoph/.sec
|
||||
|
||||
% ffmpeg
|
||||
# Create a slow motion version of a video with interpolated/blended frames
|
||||
ffmpeg -i <input> -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=<doublefps>',setpts=2*PTS" output.mp4
|
||||
ffmpeg -i "<input>" -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=<doublefps>',setpts=2*PTS" output.mp4
|
||||
$ input: eza -f -1
|
||||
|
||||
% ffmpeg
|
||||
# Detect black bar dimensions automatically by looking at the first 10 frames
|
||||
ffmpeg -i <input> -vframes 10 -vf cropdetect -f null -
|
||||
ffmpeg -i "<input>" -vframes 10 -vf cropdetect -f null -
|
||||
$ input: eza -f -1
|
||||
|
||||
% ffmpeg
|
||||
# Preview video with applied crop settings
|
||||
ffplay -vf crop=<width>:<height>:<x>:<y> <input>
|
||||
ffplay -vf crop=<width>:<height>:<x>:<y> "<input>"
|
||||
$ input: eza -f -1
|
||||
|
||||
% ffmpeg
|
||||
# Re-encode the video with applied crop settings
|
||||
ffmpeg -i <input> -vf crop=<width>:<height>:<x>:<y> -c:a copy output.mp4
|
||||
ffmpeg -i "<input>" -vf crop=<width>:<height>:<x>:<y> -c:a copy output.mp4
|
||||
$ input: eza -f -1
|
||||
|
||||
% ffmpeg
|
||||
# Reencode and compress the video using the h265 codec
|
||||
ffmpeg -i <input> -vcodec libx265 -crf <quality> out_<input>
|
||||
$ input: eza -f -1
|
||||
$ quality: echo -e "24\n25\n26\n27\n28\n29\n30\n"
|
||||
|
||||
% ffmpeg
|
||||
# Reencode, compress and scale the video using the h265 codec
|
||||
ffmpeg -i <input> -vcodec libx265 -crf <quality> -vf scale=<width>:-2,setsar=1:1 out_<input>
|
||||
ffmpeg -i "<input>" -vcodec libx265 -crf <quality> "out_<input>"
|
||||
$ input: eza -f -1
|
||||
$ quality: echo -e "24\n25\n26\n27\n28\n29\n30\n"
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
.bordered-images img {
|
||||
border-radius: var(--callout-radius);
|
||||
/* border-style: solid; */
|
||||
/* border-width: var(--callout-border-width); */
|
||||
/* border-color: var(--color-purple-rgb); */
|
||||
/* box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); */
|
||||
|
||||
/* Background color so PNGs with transparent backgrounds don't look weird */
|
||||
/* background-color: var(--background-secondary); */
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
.center-images img {
|
||||
display: block !important;
|
||||
margin-left: auto !important;
|
||||
margin-right: auto !important;
|
||||
img[alt*="center"] {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
.fullwidth-images img {
|
||||
width: 100% !important;
|
||||
height: auto !important;
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
.justify-text.cm-s-obsidian,
|
||||
.justify-text.markdown-preview-view {
|
||||
text-align: justify;
|
||||
hyphens: auto;
|
||||
}
|
||||
@@ -4,19 +4,17 @@
|
||||
pkgs,
|
||||
}: let
|
||||
pythonPkgs = pkgs.python314Packages.overrideScope (self: super: {
|
||||
# NOTE: Typer override apparently no longer required on 2026-08-31
|
||||
#
|
||||
# typer = super.typer.overridePythonAttrs (old: {
|
||||
# version = "0.20.1";
|
||||
# src = pkgs.fetchPypi {
|
||||
# pname = "typer";
|
||||
# version = "0.20.0";
|
||||
# sha256 = "sha256-Gq9klAMXk+SHb7C6z6apErVRz0PB5jyADfixqGZyDDc=";
|
||||
# };
|
||||
# propagatedBuildInputs = with pythonPkgs; [
|
||||
# typing-extensions
|
||||
# ];
|
||||
# });
|
||||
typer = super.typer.overridePythonAttrs (old: {
|
||||
version = "0.20.1";
|
||||
src = pkgs.fetchPypi {
|
||||
pname = "typer";
|
||||
version = "0.20.0";
|
||||
sha256 = "sha256-Gq9klAMXk+SHb7C6z6apErVRz0PB5jyADfixqGZyDDc=";
|
||||
};
|
||||
propagatedBuildInputs = with pythonPkgs; [
|
||||
typing-extensions
|
||||
];
|
||||
});
|
||||
|
||||
aiofiles = super.aiofiles.overridePythonAttrs (old: {
|
||||
version = "25.1.0";
|
||||
@@ -36,12 +34,12 @@
|
||||
in
|
||||
pythonPkgs.buildPythonApplication rec {
|
||||
pname = "tiddl";
|
||||
version = "3.4.3";
|
||||
version = "3.2.0";
|
||||
format = "pyproject";
|
||||
|
||||
src = pythonPkgs.fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "sha256-45KHNS1IP59DsH8i2uQ7sua6T21vW/Yw1PQg55jzLGs=";
|
||||
sha256 = "sha256-uLkGyIScYPqFgQdPAOYJDJG0jp+nDAwIl2kFkaJZFco=";
|
||||
};
|
||||
|
||||
dontCheckRuntimeDeps = true;
|
||||
|
||||
Generated
+234
-1197
File diff suppressed because it is too large
Load Diff
@@ -36,7 +36,7 @@
|
||||
sops-nix.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Secure boot
|
||||
lanzaboote.url = "github:nix-community/lanzaboote/v1.1.0";
|
||||
lanzaboote.url = "github:nix-community/lanzaboote/v0.4.3";
|
||||
lanzaboote.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Nix User Repository (e.g. Firefox addons)
|
||||
@@ -47,10 +47,6 @@
|
||||
nps.url = "github:OleMussmann/nps";
|
||||
nps.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Nix Gaming
|
||||
nix-gaming.url = "github:fufexan/nix-gaming";
|
||||
nix-gaming.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Run unpatched binaries on NixOS
|
||||
nix-alien.url = "github:thiagokokada/nix-alien";
|
||||
# Don't follow nixpkgs:
|
||||
@@ -58,16 +54,9 @@
|
||||
# nix-alien.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Niri
|
||||
# niri.url = "github:sodiboo/niri-flake";
|
||||
niri.url = "github:epireyn/niri-flake"; # NOTE: Updated fork of sodiboo's
|
||||
niri.url = "github:sodiboo/niri-flake";
|
||||
niri.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Hyprland
|
||||
hyprland.url = "github:hyprwm/Hyprland";
|
||||
# hyprland.inputs.nixpkgs.follows = "nixpkgs";
|
||||
hyprland-plugins.url = "github:hyprwm/hyprland-plugins";
|
||||
hyprland-plugins.inputs.hyprland.follows = "hyprland";
|
||||
|
||||
# Walker
|
||||
elephant.url = "github:abenz1267/elephant";
|
||||
walker.url = "github:abenz1267/walker";
|
||||
@@ -75,7 +64,7 @@
|
||||
|
||||
# NeoVim <3
|
||||
nixvim.url = "github:nix-community/nixvim";
|
||||
# nixvim.inputs.nixpkgs.follows = "nixpkgs";
|
||||
nixvim.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Emacs nightly
|
||||
# emacs-overlay.url = "github:nix-community/emacs-overlay";
|
||||
@@ -89,24 +78,10 @@
|
||||
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
|
||||
# nix-flatpak.inputs.nixpkgs.follows = "nixpkgs"; # nix-flatpak doesn't have this
|
||||
|
||||
# Instant Direnv (load environment in background)
|
||||
# direnv-instant.url = "github:Mic92/direnv-instant";
|
||||
# direnv-instant.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Realtime audio
|
||||
# musnix.url = "github:musnix/musnix";
|
||||
# musnix.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
claude-desktop.url = "github:aaddrick/claude-desktop-debian";
|
||||
claude-desktop.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Unofficial
|
||||
codex-desktop-linux.url = "github:ilysenko/codex-desktop-linux";
|
||||
codex-desktop-linux.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
stylix.url = "github:nix-community/stylix";
|
||||
stylix.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# HyTale
|
||||
hytale-launcher.url = "github:JPyke3/hytale-launcher-nix";
|
||||
|
||||
@@ -163,7 +138,7 @@
|
||||
inputs.nur.overlays.default
|
||||
inputs.niri.overlays.niri
|
||||
# inputs.emacs-overlay.overlay
|
||||
inputs.claude-desktop.overlays.default
|
||||
# inputs.comfyui-nix.overlays.default
|
||||
|
||||
# All my own overlays (derivations + modifications)
|
||||
(import ./overlays {inherit inputs nixpkgs pkgs-stable;})
|
||||
@@ -246,10 +221,7 @@
|
||||
hostname = "darwinix";
|
||||
username = "christoph";
|
||||
headless = false;
|
||||
extraModules = [
|
||||
inputs.sops-nix.darwinModules.sops
|
||||
inputs.stylix.darwinModules.stylix
|
||||
];
|
||||
extraModules = [];
|
||||
};
|
||||
};
|
||||
|
||||
@@ -275,9 +247,8 @@
|
||||
extraModules =
|
||||
[
|
||||
inputs.disko.nixosModules.disko
|
||||
inputs.stylix.nixosModules.stylix
|
||||
inputs.nix-gaming.nixosModules.platformOptimizations
|
||||
inputs.codex-desktop-linux.nixosModules.default
|
||||
# inputs.nixified-ai.nixosModules.comfyui
|
||||
# inputs.comfyui-nix.nixosModules.default
|
||||
]
|
||||
++ commonModules;
|
||||
};
|
||||
|
||||
+2
-191
@@ -54,7 +54,7 @@ in
|
||||
cursorSize = 24;
|
||||
cursorPackage = pkgs.bibata-cursors;
|
||||
|
||||
iconTheme = "Papirus-Dark";
|
||||
iconTheme = "Papirus";
|
||||
iconPackage = pkgs.papirus-icon-theme;
|
||||
|
||||
scheme = "catppuccin-mocha";
|
||||
@@ -77,193 +77,6 @@ in
|
||||
disableTabBar = true;
|
||||
};
|
||||
|
||||
hyprland = {
|
||||
enable = nixosConfig.programs.hyprland.enable;
|
||||
bars.enable = false;
|
||||
hyprpanel.enable = false;
|
||||
|
||||
keybindings = {
|
||||
main-mod = "SUPER";
|
||||
|
||||
bindings = let
|
||||
sessionMenu = mylib.rofi.mkMenu {
|
||||
prompt = "Session2";
|
||||
layers = [
|
||||
{
|
||||
" Poweroff" = "poweroff";
|
||||
" Reboot" = "reboot";
|
||||
" Lock" = "loginctl lock-session";
|
||||
# " Reload Hyprpanel" = "systemctl --user restart hyprpanel.service";
|
||||
" Reload Hyprland" = "hyprctl reload";
|
||||
" Exit Hyprland" = "hyprctl dispatch exit";
|
||||
# " Exit Niri" = "niri msg action quit";
|
||||
}
|
||||
];
|
||||
prompts = ["Select Session Action"];
|
||||
rofiCmd = "walker -d";
|
||||
};
|
||||
in
|
||||
lib.mergeAttrsList [
|
||||
{
|
||||
"$mainMod SHIFT, a" = ["exec, walker -m providerlist"];
|
||||
"$mainMod, a" = ["exec, walker -m desktopapplications"];
|
||||
"$mainMod, c" = ["exec, walker -m clipboard"];
|
||||
"$mainMod, Escape" = ["exec, ${sessionMenu}/bin/rofi-menu-Session2"];
|
||||
"$mainMod CTRL, w" = ["exec, waypaper"];
|
||||
}
|
||||
{
|
||||
# Applications
|
||||
"$mainMod, t" = ["exec, kitty"];
|
||||
"$mainMod, e" = ["exec, kitty --title=Yazi yazi"];
|
||||
"$mainMod, n" = ["exec, neovide"];
|
||||
# "$mainMod, r" = ["exec, kitty --title=Rmpc rmpc"];
|
||||
"$mainMod CTRL, n" = ["exec, kitty --title=Navi navi"];
|
||||
"$mainMod SHIFT, n" = ["exec, neovide ${config.paths.dotfiles}/navi/christoph.cheat"];
|
||||
"$mainMod SHIFT, f" = ["exec, neovide ${config.paths.dotfiles}/flake.nix"];
|
||||
# "ALT, tab" = ["exec, rofi -show window"];
|
||||
|
||||
# Screenshots
|
||||
"$mainMod, p" = ["exec, hyprpicker --autocopy --format=hex"];
|
||||
"$mainMod, s" = ["exec, grim -g \"$(slurp)\""];
|
||||
"$mainMod SHIFT, s" = ["exec, grim -g \"$(slurp)\" - | wl-copy"];
|
||||
|
||||
# Audio
|
||||
", XF86AudioRaiseVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"];
|
||||
", XF86AudioLowerVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-"];
|
||||
", XF86AudioPlay" = ["exec, playerctl play-pause"];
|
||||
", XF86AudioPrev" = ["exec, playerctl previous"];
|
||||
", XF86AudioNext" = ["exec, playerctl next"];
|
||||
|
||||
# Brightness
|
||||
", XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset gamma -10"];
|
||||
", XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset gamma +10"];
|
||||
"$mainMod, XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset temperature 5750"];
|
||||
"$mainMod, XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset identity"];
|
||||
|
||||
"CTRL ALT, f" = let
|
||||
hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl";
|
||||
grep = "${pkgs.gnugrep}/bin/grep";
|
||||
awk = "${pkgs.gawk}/bin/gawk";
|
||||
notify = "${pkgs.libnotify}/bin/notify-send";
|
||||
|
||||
toggleMouseFocus = pkgs.writeScriptBin "hypr-toggle-mouse-focus" ''
|
||||
CURRENT=$(${hyprctl} getoption input:follow_mouse | ${grep} int | ${awk} -F' ' '{print $2}')
|
||||
|
||||
if [[ "$CURRENT" == "1" ]]; then
|
||||
${hyprctl} keyword input:follow_mouse 0
|
||||
${notify} "Disabled Mouse Focus!"
|
||||
else
|
||||
${hyprctl} keyword input:follow_mouse 1
|
||||
${notify} "Enabled Mouse Focus!"
|
||||
fi
|
||||
'';
|
||||
in ["exec, ${toggleMouseFocus}/bin/hypr-toggle-mouse-focus"];
|
||||
|
||||
# "CTRL ALT, t" = ["exec, bash -c 'systemctl --user restart hyprpanel.service'"];
|
||||
}
|
||||
];
|
||||
|
||||
ws-bindings = {
|
||||
# "<Workspace>" = "<Key>";
|
||||
"1" = "1";
|
||||
"2" = "2";
|
||||
"3" = "3";
|
||||
"4" = "4";
|
||||
"5" = "5";
|
||||
"6" = "6";
|
||||
"7" = "7";
|
||||
"8" = "8";
|
||||
"9" = "9";
|
||||
"10" = "0";
|
||||
};
|
||||
|
||||
# special-ws-bindings = {
|
||||
# "ferdium" = "x";
|
||||
# "msty" = "z";
|
||||
# "btop" = "b";
|
||||
# "rmpc" = "r";
|
||||
# };
|
||||
};
|
||||
|
||||
autostart = {
|
||||
immediate = [
|
||||
"kitty --hold fastfetch"
|
||||
# "zeal"
|
||||
# "protonvpn-app"
|
||||
|
||||
# "kdeconnect-indicator" # started by services.kdeconnect.indicator
|
||||
];
|
||||
|
||||
delayed = [
|
||||
# "keepassxc" # The tray doesn't work when started too early
|
||||
"nextcloud --background"
|
||||
];
|
||||
|
||||
special-silent = {
|
||||
# "ferdium" = ["ferdium"];
|
||||
# "msty" = ["msty"];
|
||||
# "btop" = ["kitty --title=Btop btop"];
|
||||
# "rmpc" = ["kitty --title=Rmpc rmpc"];
|
||||
};
|
||||
};
|
||||
|
||||
windowrules = [
|
||||
# Fix jetbrains tooltip flicker
|
||||
"match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$, float 1"
|
||||
"match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$, no_initial_focus 1"
|
||||
];
|
||||
|
||||
workspacerules = {
|
||||
"1" = [];
|
||||
"2" = ["neovide" "code-url-handler" "dev.zed.Zed" "code" "jetbrains-(.+)"];
|
||||
"3" = ["obsidian" "Zotero"];
|
||||
"4" = ["firefox" "Google-chrome" "chromium-browser" "org.qutebrowser.qutebrowser"];
|
||||
"5" = ["steam"];
|
||||
"6" = ["steam_app_(.+)" "factorio"];
|
||||
"7" = ["signal"];
|
||||
"8" = [];
|
||||
"9" = ["discord"];
|
||||
"10" = [];
|
||||
};
|
||||
|
||||
floating = [
|
||||
{class = "org.kde.polkit-kde-authentication-agent-1";}
|
||||
{
|
||||
class = "thunar";
|
||||
title = "File Operation Progress";
|
||||
}
|
||||
{class = "ffplay";}
|
||||
{class = "Unity";}
|
||||
{class = "code-url-handler";}
|
||||
];
|
||||
|
||||
transparent-opacity = "0.85";
|
||||
|
||||
transparent = [
|
||||
"kitty"
|
||||
"Alacritty"
|
||||
"discord"
|
||||
"signal"
|
||||
"vesktop"
|
||||
"Spotify"
|
||||
"tidal-hifi"
|
||||
"obsidian"
|
||||
"firefox"
|
||||
"org.qutebrowser.qutebrowser"
|
||||
"jetbrains-clion"
|
||||
"jetbrains-idea"
|
||||
"jetbrains-pycharm"
|
||||
"jetbrains-rustrover"
|
||||
"jetbrains-rider"
|
||||
"jetbrains-webstorm"
|
||||
"code-url-handler"
|
||||
"neovide"
|
||||
"steam"
|
||||
"ferdium"
|
||||
"Msty"
|
||||
];
|
||||
};
|
||||
|
||||
mpd.enable = !headless;
|
||||
niri.enable = nixosConfig.programs.niri.enable;
|
||||
nnn.enable = false; # Use yazi
|
||||
@@ -323,11 +136,9 @@ in
|
||||
|
||||
# Enable wayland
|
||||
XDG_SESSION_TYPE = "wayland";
|
||||
# QT_QPA_PLATFORM = "wayland;xcb";
|
||||
QT_QPA_PLATFORM = "wayland";
|
||||
NIXOS_OZONE_WL = "1";
|
||||
# ELECTRON_OZONE_PLATFORM_HINT = "auto";
|
||||
SDL_VIDEODRIVER = "wayland"; # Leave unset as gamescope uses xwayland
|
||||
SDL_VIDEODRIVER = "wayland";
|
||||
|
||||
# Run SSH_ASKPASS as GUI, not TTY for Obsidian git
|
||||
SSH_ASKPASS_REQUIRE = "prefer";
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
pkgs,
|
||||
nixosConfig,
|
||||
config,
|
||||
hostname,
|
||||
lib,
|
||||
mylib,
|
||||
username,
|
||||
@@ -18,382 +17,7 @@
|
||||
# because it forces en-US keyboard layout.
|
||||
fcitx.enable = true;
|
||||
|
||||
helix.enable = true;
|
||||
|
||||
hyprland = {
|
||||
keyboard = {
|
||||
layout = "us";
|
||||
variant = "altgr-intl";
|
||||
option = "nodeadkeys";
|
||||
};
|
||||
|
||||
monitors = {
|
||||
"DP-1" = {
|
||||
width = 3440;
|
||||
height = 1440;
|
||||
rate = 165;
|
||||
x = 1920;
|
||||
y = 0;
|
||||
scale = 1;
|
||||
bitdepth = 10;
|
||||
cm = "auto"; # with render:cm_auto_hdr, we don't need hdr here
|
||||
};
|
||||
|
||||
"DP-2" = {
|
||||
width = 1920;
|
||||
height = 1080;
|
||||
rate = 60;
|
||||
x = 0;
|
||||
y = 0;
|
||||
scale = 1;
|
||||
};
|
||||
};
|
||||
|
||||
workspaces = {
|
||||
"DP-1" = [1 2 3 4 5 6 7 8 9];
|
||||
"DP-2" = [10];
|
||||
};
|
||||
|
||||
autostart = {
|
||||
delayed = [
|
||||
"fcitx5"
|
||||
];
|
||||
};
|
||||
|
||||
floating = [
|
||||
{
|
||||
class = "fcitx";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
waybar.monitors = ["DP-1" "DP-2"];
|
||||
vscode.enable = true;
|
||||
zed.enable = true;
|
||||
};
|
||||
|
||||
programs = {
|
||||
claude-code = {
|
||||
enable = true;
|
||||
enableMcpIntegration = true;
|
||||
};
|
||||
|
||||
codexDesktopLinux = {
|
||||
enable = true;
|
||||
linuxFeatures = [
|
||||
"frameless-titlebar"
|
||||
"global-dictation"
|
||||
"read-aloud"
|
||||
"tray-usage"
|
||||
"ui-tweaks"
|
||||
];
|
||||
};
|
||||
|
||||
# NOTE: Starts extremely slow
|
||||
ghostty = {
|
||||
enable = true;
|
||||
enableFishIntegration = true;
|
||||
systemd.enable = true;
|
||||
|
||||
settings = {
|
||||
theme = "catppuccin-mocha";
|
||||
font-family = config.homemodules.color.font;
|
||||
font-size = 12;
|
||||
window-padding-x = 10;
|
||||
window-padding-y = 10;
|
||||
adjust-cursor-thickness = 1;
|
||||
|
||||
cursor-click-to-move = true;
|
||||
gtk-single-instance = true;
|
||||
# link-previews = true;
|
||||
};
|
||||
|
||||
themes = let
|
||||
color = config.homemodules.color;
|
||||
in {
|
||||
catppuccin-mocha = {
|
||||
background = color.hex.base;
|
||||
cursor-color = color.hex.rosewater;
|
||||
foreground = color.hex.text;
|
||||
palette = [
|
||||
"0=#${color.hex.surface1}"
|
||||
"1=#${color.hex.red}"
|
||||
"2=#${color.hex.green}"
|
||||
"3=#${color.hex.yellow}"
|
||||
"4=#${color.hex.blue}"
|
||||
"5=#${color.hex.pink}"
|
||||
"6=#${color.hex.teal}"
|
||||
"7=#${color.hex.subtext1}"
|
||||
"8=#${color.hex.surface2}"
|
||||
"9=#${color.hex.red}"
|
||||
"10=#${color.hex.green}"
|
||||
"11=#${color.hex.yellow}"
|
||||
"12=#${color.hex.blue}"
|
||||
"13=#${color.hex.pink}"
|
||||
"14=#${color.hex.teal}"
|
||||
"15=#${color.hex.subtext0}"
|
||||
];
|
||||
selection-background = color.hex.surface1;
|
||||
selection-foreground = color.hex.text;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mcp = {
|
||||
enable = true;
|
||||
servers = {
|
||||
context7 = {
|
||||
command = "npx";
|
||||
args = ["-y" "@upstash/context7-mcp"];
|
||||
env = {
|
||||
CONTEXT7_API_KEY.file = nixosConfig.sops.secrets.context7-api-key.path;
|
||||
};
|
||||
};
|
||||
# deepwiki = {
|
||||
# # https://mcpservers.org/servers/devin/deepwiki
|
||||
# url = "https://mcp.deepwiki.com/mcp";
|
||||
# };
|
||||
# github = {
|
||||
# # https://mcpservers.org/servers/github-mcp-server
|
||||
# url = "https://api.githubcopilot.com/mcp/";
|
||||
# headers = {
|
||||
# Authorization = "Bearer ${input:github_mcp_pat}";
|
||||
# };
|
||||
# };
|
||||
nixos = {
|
||||
command = "uvx";
|
||||
args = ["mcp-nixos"];
|
||||
};
|
||||
obsidian = {
|
||||
command = "uvx";
|
||||
args = ["mcp-obsidian"];
|
||||
env = {
|
||||
OBSIDIAN_API_KEY.file = nixosConfig.sops.secrets.obsidian-rest-api-key.path;
|
||||
OBSIDIAN_HOST = "127.0.0.1";
|
||||
OBSIDIAN_PORT = "27124";
|
||||
};
|
||||
};
|
||||
svelte = {
|
||||
# claude mcp add -t stdio -s [scope] svelte -- npx -y @sveltejs/mcp
|
||||
command = "npx";
|
||||
args = ["-y" "@sveltejs/mcp"];
|
||||
type = "stdio";
|
||||
};
|
||||
shadcn = {
|
||||
# npx shadcn@latest mcp init --client claude
|
||||
command = "npx";
|
||||
args = ["-y" "shadcn@latest" "mcp"];
|
||||
};
|
||||
zotero = {
|
||||
command = "uvx";
|
||||
args = ["zotero-mcp-server"];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
opencode = {
|
||||
enable = true;
|
||||
enableMcpIntegration = true;
|
||||
extraPackages = with pkgs; [
|
||||
# opencode-claude-auth # Installed using npm
|
||||
];
|
||||
|
||||
# Writes opencode.json
|
||||
settings = {
|
||||
attachment = {
|
||||
image = {
|
||||
auto_resize = true;
|
||||
max_width = 2000;
|
||||
max_height = 2000;
|
||||
max_base64_bytes = 5242880;
|
||||
};
|
||||
};
|
||||
autoupdate = false;
|
||||
compaction = {
|
||||
auto = true;
|
||||
prune = true;
|
||||
reserved = 10000;
|
||||
};
|
||||
default_agent = "plan";
|
||||
enabled_providers = [
|
||||
"opencode"
|
||||
"opencode-go"
|
||||
"anthropic"
|
||||
"lmstudio"
|
||||
];
|
||||
formatter = {
|
||||
nixfmt = {
|
||||
disabled = true;
|
||||
};
|
||||
alejandra = {
|
||||
command = ["alejandra" "$FILE"];
|
||||
extensions = [".nix"];
|
||||
};
|
||||
perltidy = {
|
||||
command = ["perltidy" "$FILE"];
|
||||
extensions = [".pl"];
|
||||
};
|
||||
};
|
||||
lsp = {
|
||||
nixd = {
|
||||
command = ["nixd"];
|
||||
extensions = [".nix"];
|
||||
initialization = {
|
||||
preferences = {
|
||||
nixd = {
|
||||
nixpkgs = {expr = "import <nixpkgs> {}";};
|
||||
options = {
|
||||
nixos = {expr = "(builtins.getFlake \"/home/${username}/NixFlake\").nixosConfigurations.${hostname}.options";};
|
||||
home-manager = {expr = "(builtins.getFlake \"/home/${username}/NixFlake\").nixosConfigurations.\"${hostname}\".options.home-manager.users.type.getSubOptions []";};
|
||||
};
|
||||
diagnostic = {
|
||||
suppress = ["sema-escaping-with" "var-bind-to-this" "escaping-this-with"];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
perlnavigator = {
|
||||
command = ["perlnavigator"];
|
||||
extensions = [".pl"];
|
||||
initialization = {
|
||||
preferences = {};
|
||||
};
|
||||
};
|
||||
# perlpls = {
|
||||
# command = ["pls"];
|
||||
# extensions = [".pl"];
|
||||
# initialization = {
|
||||
# preferences = {
|
||||
# perl = {
|
||||
# perlcritic = {enabled = false;};
|
||||
# syntax = {enabled = true;};
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
r-language-server = {
|
||||
command = ["R" "--no-echo" "-e" "languageserver::run()"];
|
||||
extensions = [".r" ".rmd" ".quarto"];
|
||||
};
|
||||
};
|
||||
permission = {
|
||||
"*" = "ask";
|
||||
"bash" = {
|
||||
"*" = "ask";
|
||||
"awk *" = "ask"; # Can modify files
|
||||
"basename *" = "allow";
|
||||
"cmp *" = "allow";
|
||||
"cut *" = "allow";
|
||||
"df *" = "allow";
|
||||
"dirname *" = "allow";
|
||||
"du *" = "allow";
|
||||
"echo *" = "allow";
|
||||
"fd *" = "ask"; # Can execute commands
|
||||
"file *" = "allow";
|
||||
"find *" = "ask"; # Can execute commands
|
||||
"grep *" = "allow";
|
||||
"head *" = "allow";
|
||||
"ls *" = "allow";
|
||||
"nl *" = "allow";
|
||||
"od *" = "allow";
|
||||
"pwd *" = "allow";
|
||||
"readlink *" = "allow";
|
||||
"rg *" = "ask"; # Can execute commands
|
||||
"sed *" = "ask"; # Can modify files
|
||||
"sha256sum *" = "allow";
|
||||
"sha512sum *" = "allow";
|
||||
"sort *" = "ask"; # Can modify files
|
||||
"stat *" = "allow";
|
||||
"tail *" = "allow";
|
||||
"test *" = "allow";
|
||||
"tr *" = "allow";
|
||||
"uniq *" = "ask"; # Can modify files
|
||||
"wc *" = "allow";
|
||||
"which *" = "allow";
|
||||
"xargs *" = "ask"; # Can modify files
|
||||
|
||||
"cat *.env" = "deny";
|
||||
"cat *.env.*" = "deny";
|
||||
"cat *.env.example" = "allow";
|
||||
"printenv *" = "deny";
|
||||
"env *" = "deny";
|
||||
|
||||
"nix eval *" = "allow";
|
||||
"nix flake metadata *" = "allow";
|
||||
"nix flake show *" = "allow";
|
||||
"nix path-info *" = "allow";
|
||||
"nix why-depends *" = "allow";
|
||||
"nix derivation show *" = "allow";
|
||||
"nix store ping *" = "allow";
|
||||
"nix store diff-closures *" = "allow";
|
||||
|
||||
"git branch *" = "ask";
|
||||
"git check-ignore *" = "allow";
|
||||
"git diff *" = "allow";
|
||||
"git log *" = "allow";
|
||||
"git ls-files *" = "allow";
|
||||
"git ls-tree *" = "allow";
|
||||
"git remote *" = "ask";
|
||||
"git rev-list *" = "allow";
|
||||
"git rev-parse *" = "allow";
|
||||
"git stash *" = "ask";
|
||||
"git status *" = "allow";
|
||||
};
|
||||
"external_directory" = {
|
||||
"/nix/store/**" = "allow";
|
||||
"/tmp" = "allow";
|
||||
"/tmp/*" = "allow";
|
||||
};
|
||||
"read" = {
|
||||
"*" = "allow";
|
||||
"*.env" = "deny";
|
||||
"*.env.*" = "deny";
|
||||
"*.env.example" = "allow";
|
||||
};
|
||||
"grep" = "allow";
|
||||
"glob" = "allow";
|
||||
"lsp" = "allow";
|
||||
"skill" = "allow";
|
||||
"task" = "ask";
|
||||
"todowrite" = "allow";
|
||||
"webfetch" = "allow";
|
||||
"websearch" = "allow";
|
||||
"question" = "allow";
|
||||
};
|
||||
plugin = [
|
||||
# "opencode-claude-auth@latest" # https://github.com/griffinmartin/opencode-claude-auth
|
||||
# "@tarquinen/opencode-dcp@latest" # better compacting
|
||||
# "opencode-lmstudio@0.3.1"
|
||||
# "@slkiser/opencode-quota"
|
||||
];
|
||||
share = "disabled";
|
||||
shell = "fish";
|
||||
snapshot = false;
|
||||
watcher = {
|
||||
ignore = ["node_modules/**" "dist/**" ".git/**"];
|
||||
};
|
||||
};
|
||||
|
||||
# Writes tui.json
|
||||
tui = {
|
||||
theme = "system";
|
||||
diff_style = "auto";
|
||||
mouse = true;
|
||||
attention = {
|
||||
enabled = true;
|
||||
notifications = true;
|
||||
sound = true;
|
||||
volume = "0.3";
|
||||
};
|
||||
};
|
||||
|
||||
agents = {};
|
||||
commands = {};
|
||||
context = '''';
|
||||
skills = {};
|
||||
tools = {};
|
||||
};
|
||||
};
|
||||
|
||||
home = let
|
||||
@@ -451,9 +75,9 @@
|
||||
# jetbrains.idea-ultimate
|
||||
# jetbrains.webstorm
|
||||
# jetbrains.rider
|
||||
zed-editor
|
||||
vscode
|
||||
# ghidra # launch with _JAVA_AWT_WM_NONREPARENTING=1 (use programs.ghidra)
|
||||
# zed-editor # Using module
|
||||
# vscode # Using module
|
||||
|
||||
# Unity Stuff
|
||||
# unityhub
|
||||
@@ -472,17 +96,17 @@
|
||||
makemkv
|
||||
lrcget
|
||||
# msty
|
||||
# jellyfin-media-player # CVE, can't install
|
||||
jellyfin-desktop
|
||||
jellyfin-mpv-shim
|
||||
# tidal-hifi
|
||||
# tidal-dl-ng # TODO: Borked
|
||||
# spotdl
|
||||
tiddl
|
||||
picard
|
||||
handbrake
|
||||
teamspeak6-client
|
||||
|
||||
# virt-manager # use system program option
|
||||
virt-viewer
|
||||
gnome-boxes # doesn't list VMs imported using virsh
|
||||
|
||||
steam-devices-udev-rules
|
||||
];
|
||||
|
||||
@@ -515,51 +139,21 @@
|
||||
stateVersion = "22.05";
|
||||
};
|
||||
|
||||
# Cyberpunk 2077 NXM handler
|
||||
xdg.desktopEntries."modorganizer2-nxm-handler-cyberpunk" = {
|
||||
type = "Application";
|
||||
categories = ["Game"];
|
||||
name = "Mod Organizer 2 NXM Handler (Cyberpunk 2077)";
|
||||
mimeType = ["x-scheme-handler/nxm"];
|
||||
exec = let
|
||||
# Paths seen from inside the Flatpak Steam sandbox
|
||||
steam = "$HOME/.steam/steam";
|
||||
steamapps = "$HOME/Games/SteamLibrary/steamapps";
|
||||
proton = "Proton - Experimental";
|
||||
|
||||
# Runs inside flatpak's sandbox
|
||||
innerCommand = ''
|
||||
export STEAM_COMPAT_CLIENT_INSTALL_PATH="${steam}"
|
||||
export STEAM_COMPAT_DATA_PATH="${steamapps}/compatdata/1091500"
|
||||
exec "${steam}/steamapps/common/${proton}/proton" run \
|
||||
"$HOME/Games/CyberpunkMO2/nxmhandler.exe" "$1"
|
||||
'';
|
||||
|
||||
# Important: Run through flatpak's/steam's runtimes
|
||||
nxmHandler = pkgs.writeShellScript "cyberpunk-nxm-handler" ''
|
||||
exec flatpak run --command=sh com.valvesoftware.Steam -c ${lib.escapeShellArg innerCommand} _ "$1"
|
||||
'';
|
||||
in "${nxmHandler} %u";
|
||||
};
|
||||
|
||||
services = {
|
||||
flatpak = {
|
||||
packages = [
|
||||
"com.valvesoftware.Steam"
|
||||
"com.valvesoftware.Steam.Utility.steamtinkerlaunch"
|
||||
"org.freedesktop.Platform.VulkanLayer.gamescope/x86_64/25.08" # TODO: Doesn't work
|
||||
"org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/25.08"
|
||||
"org.freedesktop.Platform.VulkanLayer.gamescope/x86_64/24.08"
|
||||
"org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/24.08"
|
||||
"io.github.Foldex.AdwSteamGtk"
|
||||
"com.vysp3r.ProtonPlus"
|
||||
"com.github.Matoking.protontricks"
|
||||
# "net.davidotek.pupgui2"
|
||||
|
||||
"org.prismlauncher.PrismLauncher"
|
||||
"com.usebottles.bottles"
|
||||
"io.github.lawstorant.boxflat"
|
||||
|
||||
"org.onlyoffice.desktopeditors"
|
||||
|
||||
# "com.unity.UnityHub"
|
||||
];
|
||||
|
||||
@@ -572,37 +166,12 @@
|
||||
];
|
||||
};
|
||||
|
||||
"com.github.Matoking.protontricks".Context = {
|
||||
"com.valvesoftware.Steam".Context = {
|
||||
filesystems = [
|
||||
"${config.home.homeDirectory}/.var/app/com.valvesoftware.Steam"
|
||||
"${config.home.homeDirectory}/Games"
|
||||
];
|
||||
};
|
||||
|
||||
"com.valvesoftware.Steam" = {
|
||||
Environment = {
|
||||
PATH = "/app/bin:/app/utils/bin:/usr/bin:/usr/lib/extensions/vulkan/gamescope/bin";
|
||||
};
|
||||
Context = {
|
||||
filesystems = [
|
||||
"${config.home.homeDirectory}/Games"
|
||||
|
||||
# This is Proton-GE installed from flatpak. ProtonUpQT doesn't require it.
|
||||
"/var/lib/flatpak/runtime/com.valvesoftware.Steam.CompatibilityTool.Proton-GE"
|
||||
|
||||
# This is gamescope installed from flatpak
|
||||
"/usr/lib/extensions/vulkan/gamescope/bin"
|
||||
|
||||
# So ModOrganizer2 can load this plugin symlinked from here
|
||||
"${config.home.homeDirectory}/Projects/ModOrganizer2_Cyberpunk_Plugin"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
"com.valvesoftware.Steam.Utility.steamtinkerlaunch".Context = {
|
||||
filesystems = [
|
||||
"${config.home.homeDirectory}/.var/app/com.valvesoftware.Steam"
|
||||
"${config.home.homeDirectory}/Games"
|
||||
# This is Proton-GE installed from flatpak. ProtonUpQT doesn't require it.
|
||||
"/var/lib/flatpak/runtime/com.valvesoftware.Steam.CompatibilityTool.Proton-GE"
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
{pkgs, ...}: {
|
||||
config = {
|
||||
homemodules = {
|
||||
# TODO: Niri config (needs to modularize niri module)
|
||||
|
||||
hyprland = {
|
||||
keyboard = {
|
||||
layout = "us";
|
||||
@@ -27,7 +25,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
waybar.monitors = ["eDP-1"];
|
||||
waybar.monitor = "eDP-1";
|
||||
};
|
||||
|
||||
home = {
|
||||
|
||||
+7
-7
@@ -15,10 +15,10 @@ in {
|
||||
options.homemodules.helix = import ./options.nix {inherit lib mylib;};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
# home.sessionVariables = {
|
||||
# EDITOR = "hx";
|
||||
# VISUAL = "hx";
|
||||
# };
|
||||
home.sessionVariables = {
|
||||
EDITOR = "hx";
|
||||
VISUAL = "hx";
|
||||
};
|
||||
|
||||
programs.helix = {
|
||||
enable = true;
|
||||
@@ -40,11 +40,11 @@ in {
|
||||
|
||||
# https://docs.helix-editor.com/configuration.html
|
||||
settings = {
|
||||
theme = "catppuccin_mocha";
|
||||
theme = "catppuccin_latte";
|
||||
editor = {
|
||||
scrolloff = 10;
|
||||
mouse = true;
|
||||
middle-click-paste = true;
|
||||
mouse = false; # Default true
|
||||
middle-click-paste = false; # Default true
|
||||
line-number = "relative";
|
||||
cursorline = true;
|
||||
color-modes = true;
|
||||
+7
-8
@@ -5,12 +5,16 @@
|
||||
hyprland,
|
||||
}:
|
||||
builtins.concatLists [
|
||||
(lib.optionals hyprland.dunst.enable ["dunst"]) # Notifications
|
||||
(lib.optionals hyprland.hyprpanel.enable ["hyprpanel"]) # Panel
|
||||
(lib.optionals hyprland.caelestia.enable ["caelestia shell"]) # Panel/Shell # TODO: Crashes on startup
|
||||
[
|
||||
# Start clipboard management
|
||||
"wl-paste -t text --watch clipman store --no-persist"
|
||||
"wl-paste -p -t text --watch clipman store -P --histpath=\"~/.local/share/clipman-primary.json\""
|
||||
|
||||
"hyprctl setcursor ${config.home.pointerCursor.name} ${builtins.toString config.home.pointerCursor.size}"
|
||||
"hyprsunset --identity"
|
||||
"waypaper --restore"
|
||||
"fcitx5"
|
||||
|
||||
# HACK: Hyprland doesn't set the xwayland/x11 keymap correctly
|
||||
"setxkbmap -layout ${hyprland.keyboard.layout} -variant ${hyprland.keyboard.variant} -option ${hyprland.keyboard.option} -model pc104"
|
||||
@@ -22,11 +26,6 @@ builtins.concatLists [
|
||||
# This is used for example when running systemd commands without root.
|
||||
# "systemctl --user start hyprpolkitagent.service"
|
||||
# "${pkgs.kdePackages.polkit-kde-agent-1}/libexec/polkit-kde-authentication-agent-1"
|
||||
|
||||
# TODO: This is started by niri already (extract to module so niri/hyprland can both use it)
|
||||
# "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"
|
||||
|
||||
# TODO: This is started by niri already (extract to module so niri/hyprland can both use it)
|
||||
"dunst"
|
||||
"${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"
|
||||
]
|
||||
]
|
||||
@@ -0,0 +1,516 @@
|
||||
{
|
||||
config,
|
||||
hyprland,
|
||||
color,
|
||||
}: {
|
||||
enable = hyprland.caelestia.enable;
|
||||
|
||||
systemd = {
|
||||
enable = false; # Start from hyprland autostart
|
||||
target = "graphical-session.target";
|
||||
environment = [];
|
||||
};
|
||||
|
||||
settings = {
|
||||
appearance = {
|
||||
anim = {durations = {scale = 1;};};
|
||||
font = {
|
||||
family = {
|
||||
clock = "Rubik";
|
||||
material = "Material Symbols Rounded";
|
||||
mono = color.font;
|
||||
sans = color.font;
|
||||
};
|
||||
size = {scale = 1;};
|
||||
};
|
||||
|
||||
padding = {scale = 1;};
|
||||
rounding = {scale = 1;};
|
||||
spacing = {scale = 1;};
|
||||
|
||||
transparency = {
|
||||
base = 0.85;
|
||||
enabled = false;
|
||||
layers = 0.4;
|
||||
};
|
||||
};
|
||||
|
||||
background = {
|
||||
desktopClock = {enabled = false;};
|
||||
enabled = true;
|
||||
|
||||
# Lags when visible on both monitors (different refresh rates?)
|
||||
visualiser = {
|
||||
autoHide = true;
|
||||
blur = true;
|
||||
enabled = false;
|
||||
rounding = 1;
|
||||
spacing = 1;
|
||||
};
|
||||
};
|
||||
|
||||
bar = {
|
||||
clock = {showIcon = true;};
|
||||
dragThreshold = 20;
|
||||
|
||||
entries = [
|
||||
{
|
||||
enabled = true;
|
||||
id = "logo";
|
||||
}
|
||||
{
|
||||
enabled = true;
|
||||
id = "workspaces";
|
||||
}
|
||||
{
|
||||
enabled = true;
|
||||
id = "spacer";
|
||||
}
|
||||
{
|
||||
enabled = true;
|
||||
id = "activeWindow";
|
||||
}
|
||||
{
|
||||
enabled = true;
|
||||
id = "spacer";
|
||||
}
|
||||
{
|
||||
enabled = true;
|
||||
id = "clock";
|
||||
}
|
||||
{
|
||||
enabled = true;
|
||||
id = "tray";
|
||||
}
|
||||
{
|
||||
enabled = true;
|
||||
id = "statusIcons";
|
||||
}
|
||||
{
|
||||
enabled = true;
|
||||
id = "power";
|
||||
}
|
||||
];
|
||||
|
||||
persistent = true;
|
||||
|
||||
popouts = {
|
||||
activeWindow = true;
|
||||
statusIcons = true;
|
||||
tray = true;
|
||||
};
|
||||
|
||||
scrollActions = {
|
||||
brightness = false;
|
||||
volume = true;
|
||||
workspaces = true;
|
||||
};
|
||||
|
||||
showOnHover = true;
|
||||
|
||||
status = {
|
||||
showAudio = true;
|
||||
showBattery = false;
|
||||
showBluetooth = true;
|
||||
showKbLayout = false;
|
||||
showLockStatus = true;
|
||||
showMicrophone = false;
|
||||
showNetwork = true;
|
||||
};
|
||||
|
||||
tray = {
|
||||
background = true;
|
||||
compact = false;
|
||||
iconSubs = [];
|
||||
recolour = false;
|
||||
};
|
||||
|
||||
workspaces = {
|
||||
activeIndicator = true;
|
||||
activeLabel = "";
|
||||
activeTrail = true;
|
||||
label = " ";
|
||||
occupiedBg = false;
|
||||
occupiedLabel = "";
|
||||
perMonitorWorkspaces = false;
|
||||
showWindows = false;
|
||||
shown = 10;
|
||||
|
||||
# Pick them here: https://fonts.google.com/icons
|
||||
specialWorkspaceIcons = [
|
||||
{
|
||||
icon = "music_note";
|
||||
name = "rmpc";
|
||||
}
|
||||
{
|
||||
icon = "memory";
|
||||
name = "btop";
|
||||
}
|
||||
{
|
||||
icon = "mark_chat_unread";
|
||||
name = "ferdium";
|
||||
}
|
||||
{
|
||||
icon = "network_intelligence";
|
||||
name = "msty";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
border = {
|
||||
rounding = 25;
|
||||
thickness = 10;
|
||||
};
|
||||
|
||||
dashboard = {
|
||||
dragThreshold = 50;
|
||||
enabled = true;
|
||||
mediaUpdateInterval = 500;
|
||||
showOnHover = true;
|
||||
};
|
||||
|
||||
general = {
|
||||
apps = {
|
||||
audio = ["kitty" "--title=NcpaMixer" "-e" "ncpamixer"];
|
||||
explorer = ["kitty" "--title=Yazi" "-e" "yazi"];
|
||||
playback = ["mpv"];
|
||||
terminal = ["kitty"];
|
||||
};
|
||||
|
||||
battery = {
|
||||
criticalLevel = 3;
|
||||
warnLevels = [
|
||||
{
|
||||
icon = "battery_android_frame_2";
|
||||
level = 20;
|
||||
message = "You might want to plug in a charger";
|
||||
title = "Low battery";
|
||||
}
|
||||
{
|
||||
icon = "battery_android_frame_1";
|
||||
level = 10;
|
||||
message = "You should probably plug in a charger <b>now</b>";
|
||||
title = "Did you see the previous message?";
|
||||
}
|
||||
{
|
||||
critical = true;
|
||||
icon = "battery_android_alert";
|
||||
level = 5;
|
||||
message = "PLUG THE CHARGER RIGHT NOW!!";
|
||||
title = "Critical battery level";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
idle = {
|
||||
inhibitWhenAudio = true;
|
||||
lockBeforeSleep = true;
|
||||
timeouts = [
|
||||
{
|
||||
idleAction = "lock";
|
||||
timeout = 600;
|
||||
}
|
||||
{
|
||||
# idleAction = "dpms off";
|
||||
# returnAction = "dpms on";
|
||||
idleAction = "echo 'idle'";
|
||||
returnAction = "echo 'return'";
|
||||
timeout = 10000;
|
||||
}
|
||||
{
|
||||
# idleAction = ["systemctl" "suspend-then-hibernate"];
|
||||
idleAction = ["echo" "'idle'"];
|
||||
timeout = 20000;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
launcher = {
|
||||
actionPrefix = ">";
|
||||
actions = [
|
||||
{
|
||||
command = ["autocomplete" "calc"];
|
||||
dangerous = false;
|
||||
description = "Do simple math equations (powered by Qalc)";
|
||||
enabled = true;
|
||||
icon = "calculate";
|
||||
name = "Calculator";
|
||||
}
|
||||
{
|
||||
command = ["autocomplete" "scheme"];
|
||||
dangerous = false;
|
||||
description = "Change the current colour scheme";
|
||||
enabled = true;
|
||||
icon = "palette";
|
||||
name = "Scheme";
|
||||
}
|
||||
{
|
||||
command = ["autocomplete" "wallpaper"];
|
||||
dangerous = false;
|
||||
description = "Change the current wallpaper";
|
||||
enabled = true;
|
||||
icon = "image";
|
||||
name = "Wallpaper";
|
||||
}
|
||||
{
|
||||
command = ["autocomplete" "variant"];
|
||||
dangerous = false;
|
||||
description = "Change the current scheme variant";
|
||||
enabled = true;
|
||||
icon = "colors";
|
||||
name = "Variant";
|
||||
}
|
||||
{
|
||||
command = ["autocomplete" "transparency"];
|
||||
dangerous = false;
|
||||
description = "Change shell transparency";
|
||||
enabled = false;
|
||||
icon = "opacity";
|
||||
name = "Transparency";
|
||||
}
|
||||
{
|
||||
command = ["caelestia" "wallpaper" "-r"];
|
||||
dangerous = false;
|
||||
description = "Switch to a random wallpaper";
|
||||
enabled = false;
|
||||
icon = "casino";
|
||||
name = "Random";
|
||||
}
|
||||
{
|
||||
command = ["setMode" "light"];
|
||||
dangerous = false;
|
||||
description = "Change the scheme to light mode";
|
||||
enabled = true;
|
||||
icon = "light_mode";
|
||||
name = "Light";
|
||||
}
|
||||
{
|
||||
command = ["setMode" "dark"];
|
||||
dangerous = false;
|
||||
description = "Change the scheme to dark mode";
|
||||
enabled = true;
|
||||
icon = "dark_mode";
|
||||
name = "Dark";
|
||||
}
|
||||
{
|
||||
command = ["systemctl" "poweroff"];
|
||||
dangerous = true;
|
||||
description = "Shutdown the system";
|
||||
enabled = true;
|
||||
icon = "power_settings_new";
|
||||
name = "Shutdown";
|
||||
}
|
||||
{
|
||||
command = ["systemctl" "reboot"];
|
||||
dangerous = true;
|
||||
description = "Reboot the system";
|
||||
enabled = true;
|
||||
icon = "cached";
|
||||
name = "Reboot";
|
||||
}
|
||||
{
|
||||
command = ["loginctl" "terminate-user" ""];
|
||||
dangerous = true;
|
||||
description = "Log out of the current session";
|
||||
enabled = true;
|
||||
icon = "exit_to_app";
|
||||
name = "Logout";
|
||||
}
|
||||
{
|
||||
command = ["loginctl" "lock-session"];
|
||||
dangerous = false;
|
||||
description = "Lock the current session";
|
||||
enabled = true;
|
||||
icon = "lock";
|
||||
name = "Lock";
|
||||
}
|
||||
{
|
||||
command = ["systemctl" "suspend-then-hibernate"];
|
||||
dangerous = false;
|
||||
description = "Suspend then hibernate";
|
||||
enabled = false;
|
||||
icon = "bedtime";
|
||||
name = "Sleep";
|
||||
}
|
||||
];
|
||||
|
||||
dragThreshold = 50;
|
||||
enableDangerousActions = true;
|
||||
hiddenApps = [];
|
||||
maxShown = 7;
|
||||
maxWallpapers = 9;
|
||||
showOnHover = false;
|
||||
specialPrefix = "@";
|
||||
useFuzzy = {
|
||||
actions = false;
|
||||
apps = false;
|
||||
schemes = false;
|
||||
variants = false;
|
||||
wallpapers = false;
|
||||
};
|
||||
vimKeybinds = false;
|
||||
};
|
||||
|
||||
lock = {recolourLogo = false;};
|
||||
|
||||
notifs = {
|
||||
actionOnClick = false;
|
||||
clearThreshold = 0.3;
|
||||
defaultExpireTimeout = 5000;
|
||||
expandThreshold = 20;
|
||||
expire = true;
|
||||
};
|
||||
|
||||
osd = {
|
||||
enableBrightness = false;
|
||||
enableMicrophone = true;
|
||||
enabled = true;
|
||||
hideDelay = 2000;
|
||||
};
|
||||
|
||||
paths = {
|
||||
mediaGif = "root:/assets/bongocat.gif";
|
||||
sessionGif = "root:/assets/kurukuru.gif";
|
||||
wallpaperDir = "~/NixFlake/wallpapers";
|
||||
};
|
||||
|
||||
services = {
|
||||
audioIncrement = 0.1;
|
||||
defaultPlayer = "MPD";
|
||||
gpuType = "";
|
||||
maxVolume = 1;
|
||||
playerAliases = [
|
||||
{
|
||||
from = "com.github.th_ch.youtube_music";
|
||||
to = "YT Music";
|
||||
}
|
||||
];
|
||||
smartScheme = true;
|
||||
useFahrenheit = false;
|
||||
useTwelveHourClock = false;
|
||||
visualiserBars = 45;
|
||||
weatherLocation = "Dortmund, Germany";
|
||||
};
|
||||
|
||||
session = {
|
||||
commands = {
|
||||
hibernate = ["systemctl" "hibernate"];
|
||||
logout = ["loginctl" "terminate-user" ""];
|
||||
reboot = ["systemctl" "reboot"];
|
||||
shutdown = ["systemctl" "poweroff"];
|
||||
};
|
||||
dragThreshold = 30;
|
||||
enabled = true;
|
||||
vimKeybinds = false;
|
||||
};
|
||||
|
||||
sidebar = {
|
||||
dragThreshold = 80;
|
||||
enabled = true;
|
||||
};
|
||||
|
||||
utilities = {
|
||||
enabled = true;
|
||||
maxToasts = 4;
|
||||
toasts = {
|
||||
audioInputChanged = true;
|
||||
audioOutputChanged = true;
|
||||
capsLockChanged = true;
|
||||
chargingChanged = true;
|
||||
configLoaded = true;
|
||||
dndChanged = true;
|
||||
gameModeChanged = true;
|
||||
kbLayoutChanged = false;
|
||||
nowPlaying = false;
|
||||
numLockChanged = true;
|
||||
vpnChanged = true;
|
||||
};
|
||||
|
||||
vpn = {
|
||||
enabled = false;
|
||||
provider = [
|
||||
{
|
||||
displayName = "Wireguard (Your VPN)";
|
||||
interface = "your-connection-name";
|
||||
name = "wireguard";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
cli = {
|
||||
enable = hyprland.caelestia.enable;
|
||||
|
||||
settings = {
|
||||
record = {extraArgs = [];};
|
||||
|
||||
theme = {
|
||||
enableBtop = false;
|
||||
enableDiscord = false;
|
||||
enableFuzzel = false;
|
||||
enableGtk = false;
|
||||
enableHypr = false;
|
||||
enableQt = false;
|
||||
enableSpicetify = false;
|
||||
enableTerm = false;
|
||||
};
|
||||
|
||||
toggles = {
|
||||
communication = {
|
||||
discord = {
|
||||
command = ["discord"];
|
||||
enable = false;
|
||||
match = [{class = "discord";}];
|
||||
move = true;
|
||||
};
|
||||
whatsapp = {
|
||||
enable = false;
|
||||
match = [{class = "whatsapp";}];
|
||||
move = true;
|
||||
};
|
||||
};
|
||||
|
||||
music = {
|
||||
feishin = {
|
||||
enable = false;
|
||||
match = [{class = "feishin";}];
|
||||
move = true;
|
||||
};
|
||||
spotify = {
|
||||
command = ["spicetify" "watch" "-s"];
|
||||
enable = false;
|
||||
match = [{class = "Spotify";} {initialTitle = "Spotify";} {initialTitle = "Spotify Free";}];
|
||||
move = true;
|
||||
};
|
||||
};
|
||||
|
||||
sysmon = {
|
||||
btop = {
|
||||
command = ["kitty" "--title" "Btop" "-e" "btop"];
|
||||
enable = false;
|
||||
match = [
|
||||
{
|
||||
class = "btop";
|
||||
title = "Btop";
|
||||
workspace = {name = "special:sysmon";};
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
todo = {
|
||||
todoist = {
|
||||
command = ["todoist"];
|
||||
enable = false;
|
||||
match = [{class = "Todoist";}];
|
||||
move = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
wallpaper = {postHook = "echo $WALLPAPER_PATH";};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
{
|
||||
inputs,
|
||||
config,
|
||||
lib,
|
||||
mylib,
|
||||
pkgs,
|
||||
nixosConfig,
|
||||
username,
|
||||
...
|
||||
}: let
|
||||
inherit (config.homemodules) hyprland color;
|
||||
|
||||
# Autostart programs
|
||||
always-exec = import ./autostart.nix {inherit lib pkgs config hyprland;};
|
||||
|
||||
# Keybindings
|
||||
always-bind = import ./mappings.nix {inherit lib config hyprland;};
|
||||
|
||||
# Mousebindings
|
||||
always-bindm = {
|
||||
"$mainMod, mouse:272" = ["movewindow"];
|
||||
"$mainMod, mouse:273" = ["resizewindow"];
|
||||
};
|
||||
in {
|
||||
options.homemodules.hyprland = import ./options.nix {inherit lib mylib;};
|
||||
|
||||
config = lib.mkIf hyprland.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = nixosConfig.programs.hyprland.enable;
|
||||
message = "Can't enable Hyprland module with Hyprland disabled!";
|
||||
}
|
||||
{
|
||||
assertion = builtins.hasAttr "hyprlock" nixosConfig.security.pam.services;
|
||||
message = "Can't enable Hyprland module without Hyprlock PAM service!";
|
||||
}
|
||||
{
|
||||
assertion = hyprland.hyprpanel.enable != hyprland.caelestia.enable;
|
||||
message = "Can't enable Hyprpanel and Caelestia at the same time!";
|
||||
}
|
||||
];
|
||||
|
||||
gtk = {
|
||||
enable = true;
|
||||
iconTheme.package = lib.mkDefault color.iconPackage;
|
||||
iconTheme.name = color.iconTheme;
|
||||
};
|
||||
|
||||
homemodules = {
|
||||
hyprpanel.enable = hyprland.hyprpanel.enable;
|
||||
};
|
||||
|
||||
home = {
|
||||
pointerCursor = {
|
||||
gtk.enable = lib.mkDefault true;
|
||||
x11.enable = lib.mkDefault true;
|
||||
package = lib.mkDefault color.cursorPackage;
|
||||
name = color.cursor;
|
||||
size = color.cursorSize;
|
||||
};
|
||||
|
||||
packages = with pkgs; [
|
||||
hyprpaper # Wallpaper setter
|
||||
hyprpicker # Color picker
|
||||
# hyprpolkitagent # Ugly polkit authentication GUI
|
||||
hyprland-qt-support
|
||||
hyprsunset # Blue light filter
|
||||
|
||||
wl-clipboard
|
||||
clipman # Clipboard manager (wl-paste)
|
||||
libnotify
|
||||
inotify-tools # Includes inotifywait
|
||||
|
||||
ncpamixer # Audio control
|
||||
slurp # Region selector for screensharing
|
||||
grim # Grab images from compositor
|
||||
|
||||
# Deps for Qt5 and Qt6 apps (e.g., Nextcloud)
|
||||
qt5.qtwayland
|
||||
qt6.qtwayland
|
||||
];
|
||||
|
||||
file = {
|
||||
".config/hypr/keybindings.info".text = let
|
||||
fixupHomeDir = key:
|
||||
builtins.replaceStrings ["/home/${username}"] ["~"] key;
|
||||
|
||||
fixupNixStore = key: let
|
||||
# The pattern has to match the entire string, otherwise it won't work
|
||||
matches = builtins.match ".*/nix/store/(.*)/.*" key;
|
||||
in
|
||||
if (matches == null)
|
||||
then key
|
||||
else builtins.replaceStrings matches ["..."] key;
|
||||
|
||||
fixupNoMod = key:
|
||||
builtins.replaceStrings ["<-"] ["<"] key;
|
||||
|
||||
mkBindHelpKey = key:
|
||||
builtins.replaceStrings ["$mainMod" " " ","] ["${hyprland.keybindings.main-mod}" "-" ""] key;
|
||||
|
||||
mkBindHelpAction = action:
|
||||
builtins.replaceStrings [","] [""] action;
|
||||
|
||||
mkBindHelp = key: action: "<${mkBindHelpKey key}>: ${mkBindHelpAction action}";
|
||||
|
||||
mkBindsHelp = key: actions:
|
||||
actions
|
||||
|> builtins.map (mkBindHelp key)
|
||||
|> builtins.map fixupNoMod
|
||||
|> builtins.map fixupNixStore
|
||||
|> builtins.map fixupHomeDir;
|
||||
in
|
||||
(hyprland.keybindings.bindings // always-bind)
|
||||
|> builtins.mapAttrs mkBindsHelp
|
||||
|> builtins.attrValues
|
||||
|> builtins.concatLists
|
||||
|> builtins.concatStringsSep "\n";
|
||||
};
|
||||
};
|
||||
|
||||
programs = {
|
||||
hyprlock = import ./hyprlock.nix {inherit config hyprland color;};
|
||||
caelestia = import ./caelestia.nix {inherit config hyprland color;};
|
||||
};
|
||||
|
||||
services = {
|
||||
dunst = import ./dunst.nix {inherit pkgs config hyprland color;};
|
||||
hypridle = import ./hypridle.nix {inherit config hyprland color;};
|
||||
hyprpaper = import ./hyprpaper.nix {inherit config hyprland color;};
|
||||
};
|
||||
|
||||
# Make sure the units only start when using Hyprland
|
||||
systemd.user.services.dunst.Unit.After = lib.mkIf hyprland.dunst.enable (lib.mkForce ["hyprland-session.target"]);
|
||||
systemd.user.services.dunst.Unit.PartOf = lib.mkIf hyprland.dunst.enable (lib.mkForce ["hyprland-session.target"]);
|
||||
systemd.user.services.hypridle.Install.WantedBy = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
|
||||
systemd.user.services.hypridle.Unit.After = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
|
||||
systemd.user.services.hypridle.Unit.PartOf = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
|
||||
systemd.user.services.hyprpaper.Install.WantedBy = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
|
||||
systemd.user.services.hyprpaper.Unit.After = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
|
||||
systemd.user.services.hyprpaper.Unit.PartOf = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
|
||||
|
||||
wayland.windowManager.hyprland = {
|
||||
enable = true;
|
||||
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
|
||||
portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
|
||||
|
||||
systemd.enable = true; # Enable hyprland-session.target
|
||||
systemd.variables = ["--all"]; # Import PATH into systemd
|
||||
xwayland.enable = true;
|
||||
|
||||
plugins = builtins.concatLists [
|
||||
(lib.optionals
|
||||
hyprland.bars.enable
|
||||
[inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprbars])
|
||||
(lib.optionals
|
||||
hyprland.dynamicCursor.enable
|
||||
[inputs.hypr-dynamic-cursors.packages.${pkgs.stdenv.hostPlatform.system}.hypr-dynamic-cursors])
|
||||
(lib.optionals
|
||||
hyprland.trails.enable
|
||||
[inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprtrails])
|
||||
(lib.optionals
|
||||
hyprland.hyprspace.enable
|
||||
[inputs.hyprspace.packages.${pkgs.stdenv.hostPlatform.system}.Hyprspace])
|
||||
];
|
||||
|
||||
settings = import ./settings.nix {
|
||||
inherit
|
||||
lib
|
||||
config
|
||||
hyprland
|
||||
color
|
||||
always-exec
|
||||
always-bind
|
||||
always-bindm
|
||||
;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
pkgs,
|
||||
config,
|
||||
hyprland,
|
||||
color,
|
||||
}: {
|
||||
enable = hyprland.dunst.enable;
|
||||
|
||||
iconTheme.package = color.iconPackage;
|
||||
iconTheme.name = color.iconTheme;
|
||||
|
||||
settings = {
|
||||
global = {
|
||||
monitor = config.homemodules.waybar.monitor;
|
||||
font = "${color.font} 11";
|
||||
offset = "10x10";
|
||||
background = color.hexS.base;
|
||||
foreground = color.hexS.text;
|
||||
frame_width = 2;
|
||||
corner_radius = 6;
|
||||
separator_color = "frame";
|
||||
};
|
||||
|
||||
urgency_low = {
|
||||
frame_color = color.hexS.green;
|
||||
};
|
||||
|
||||
urgency_normal = {
|
||||
frame_color = color.hexS.green;
|
||||
};
|
||||
|
||||
urgency_critical = {
|
||||
frame_color = color.hexS.red;
|
||||
};
|
||||
};
|
||||
}
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
hyprland,
|
||||
color,
|
||||
}: {
|
||||
enable = true;
|
||||
enable = !hyprland.caelestia.enable;
|
||||
|
||||
settings = {
|
||||
general = {
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
keyboard = {
|
||||
layout = "us";
|
||||
variant = "altgr-intl";
|
||||
option = "nodeadkeys";
|
||||
};
|
||||
|
||||
monitors = {
|
||||
"DP-1" = {
|
||||
width = 3440;
|
||||
height = 1440;
|
||||
rate = 165;
|
||||
x = 1920;
|
||||
y = 0;
|
||||
scale = 1;
|
||||
};
|
||||
|
||||
"DP-2" = {
|
||||
width = 1920;
|
||||
height = 1080;
|
||||
rate = 60;
|
||||
x = 0;
|
||||
y = 0;
|
||||
scale = 1;
|
||||
};
|
||||
};
|
||||
|
||||
workspaces = {
|
||||
"DP-1" = [1 2 3 4 5 6 7 8 9];
|
||||
"DP-2" = [10];
|
||||
};
|
||||
|
||||
autostart = {
|
||||
delayed = [
|
||||
"fcitx5"
|
||||
];
|
||||
};
|
||||
|
||||
floating = [
|
||||
{
|
||||
class = "fcitx";
|
||||
}
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
{
|
||||
nixosConfig,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
}: {
|
||||
enable = nixosConfig.programs.hyprland.enable;
|
||||
dunst.enable = !config.homemodules.hyprpanel.enable; # Disable for hyprpanel
|
||||
bars.enable = false;
|
||||
dynamicCursor.enable = false;
|
||||
trails.enable = true;
|
||||
hyprspace.enable = false; # Always broken
|
||||
hyprpanel.enable = true;
|
||||
caelestia.enable = false;
|
||||
|
||||
keybindings = {
|
||||
main-mod = "SUPER";
|
||||
|
||||
bindings = lib.mergeAttrsList [
|
||||
# Use Rofi if we don't have caelestia
|
||||
(lib.optionalAttrs (!config.homemodules.hyprland.caelestia.enable) {
|
||||
"$mainMod, a" = ["exec, rofi -drun-show-actions -show drun"];
|
||||
"$mainMod, c" = ["exec, clipman pick --tool=rofi"];
|
||||
"$mainMod SHIFT, l" = ["exec, loginctl lock-session"];
|
||||
})
|
||||
|
||||
# Caelestia
|
||||
(lib.optionalAttrs (config.homemodules.hyprland.caelestia.enable) {
|
||||
"$mainMod, a" = ["exec, caelestia shell drawers toggle launcher"];
|
||||
# "$mainMod, c" = ["exec, caelestia clipboard"];
|
||||
"$mainMod SHIFT, l" = ["exec, caelestia shell lock lock"];
|
||||
|
||||
"$mainMod, escape" = ["exec, caelestia shell drawers toggle session"];
|
||||
})
|
||||
|
||||
{
|
||||
# Applications
|
||||
"$mainMod, t" = ["exec, kitty"];
|
||||
"$mainMod, e" = ["exec, kitty --title=Yazi yazi"];
|
||||
"$mainMod, n" = ["exec, neovide"];
|
||||
# "$mainMod, r" = ["exec, kitty --title=Rmpc rmpc"];
|
||||
"$mainMod CTRL, n" = ["exec, kitty --title=Navi navi"];
|
||||
"$mainMod SHIFT, n" = ["exec, neovide ${config.paths.dotfiles}/navi/christoph.cheat"];
|
||||
"$mainMod SHIFT, f" = ["exec, neovide ${config.paths.dotfiles}/flake.nix"];
|
||||
# "ALT, tab" = ["exec, rofi -show window"];
|
||||
|
||||
# Screenshots
|
||||
"$mainMod, p" = ["exec, hyprpicker --autocopy --format=hex"];
|
||||
"$mainMod, s" = ["exec, grim -g \"$(slurp)\""];
|
||||
"$mainMod SHIFT, s" = ["exec, grim -g \"$(slurp)\" - | wl-copy"];
|
||||
|
||||
# Audio
|
||||
", XF86AudioRaiseVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"];
|
||||
", XF86AudioLowerVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-"];
|
||||
", XF86AudioPlay" = ["exec, playerctl play-pause"];
|
||||
", XF86AudioPrev" = ["exec, playerctl previous"];
|
||||
", XF86AudioNext" = ["exec, playerctl next"];
|
||||
|
||||
# Brightness
|
||||
", XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset gamma -10"];
|
||||
", XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset gamma +10"];
|
||||
"$mainMod, XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset temperature 5750"];
|
||||
"$mainMod, XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset identity"];
|
||||
|
||||
"CTRL ALT, f" = let
|
||||
hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl";
|
||||
grep = "${pkgs.gnugrep}/bin/grep";
|
||||
awk = "${pkgs.gawk}/bin/gawk";
|
||||
notify = "${pkgs.libnotify}/bin/notify-send";
|
||||
|
||||
toggleMouseFocus = pkgs.writeScriptBin "hypr-toggle-mouse-focus" ''
|
||||
CURRENT=$(${hyprctl} getoption input:follow_mouse | ${grep} int | ${awk} -F' ' '{print $2}')
|
||||
|
||||
if [[ "$CURRENT" == "1" ]]; then
|
||||
${hyprctl} keyword input:follow_mouse 0
|
||||
${notify} "Disabled Mouse Focus!"
|
||||
else
|
||||
${hyprctl} keyword input:follow_mouse 1
|
||||
${notify} "Enabled Mouse Focus!"
|
||||
fi
|
||||
'';
|
||||
in ["exec, ${toggleMouseFocus}/bin/hypr-toggle-mouse-focus"];
|
||||
|
||||
# "CTRL ALT, t" = ["exec, bash -c 'systemctl --user restart hyprpanel.service'"];
|
||||
}
|
||||
];
|
||||
|
||||
ws-bindings = {
|
||||
# "<Workspace>" = "<Key>";
|
||||
"1" = "1";
|
||||
"2" = "2";
|
||||
"3" = "3";
|
||||
"4" = "4";
|
||||
"5" = "5";
|
||||
"6" = "6";
|
||||
"7" = "7";
|
||||
"8" = "8";
|
||||
"9" = "9";
|
||||
"10" = "0";
|
||||
};
|
||||
|
||||
special-ws-bindings = {
|
||||
"ferdium" = "x";
|
||||
"msty" = "z";
|
||||
"btop" = "b";
|
||||
"rmpc" = "r";
|
||||
};
|
||||
};
|
||||
|
||||
autostart = {
|
||||
immediate = [
|
||||
"kitty --hold fastfetch"
|
||||
"zeal"
|
||||
"nextcloud --background"
|
||||
"protonvpn-app"
|
||||
|
||||
# "kdeconnect-indicator" # started by services.kdeconnect.indicator
|
||||
];
|
||||
|
||||
delayed = [
|
||||
"keepassxc" # The tray doesn't work when started too early
|
||||
];
|
||||
|
||||
special-silent = {
|
||||
"ferdium" = ["ferdium"];
|
||||
"msty" = ["msty"];
|
||||
"btop" = ["kitty --title=Btop btop"];
|
||||
"rmpc" = ["kitty --title=Rmpc rmpc"];
|
||||
};
|
||||
};
|
||||
|
||||
windowrules = [
|
||||
# Fix jetbrains tooltip flicker
|
||||
"match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$, float 1"
|
||||
"match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$, no_initial_focus 1"
|
||||
];
|
||||
|
||||
workspacerules = {
|
||||
"1" = [];
|
||||
"2" = ["Zotero" "neovide" "code-url-handler"];
|
||||
"3" = ["obsidian"];
|
||||
"4" = ["firefox" "Google-chrome" "chromium-browser" "org.qutebrowser.qutebrowser"];
|
||||
"5" = ["steam"];
|
||||
"6" = ["steam_app_(.+)"];
|
||||
"7" = ["signal"];
|
||||
"8" = ["tidal-hifi"];
|
||||
"9" = ["discord"];
|
||||
"10" = ["python3"];
|
||||
};
|
||||
|
||||
floating = [
|
||||
{class = "org.kde.polkit-kde-authentication-agent-1";}
|
||||
{
|
||||
class = "thunar";
|
||||
title = "File Operation Progress";
|
||||
}
|
||||
{class = "ffplay";}
|
||||
{class = "Unity";}
|
||||
];
|
||||
|
||||
transparent-opacity = "0.75";
|
||||
|
||||
transparent = [
|
||||
"kitty"
|
||||
"Alacritty"
|
||||
"discord"
|
||||
"signal"
|
||||
"vesktop"
|
||||
"Spotify"
|
||||
"tidal-hifi"
|
||||
"obsidian"
|
||||
"firefox"
|
||||
"org.qutebrowser.qutebrowser"
|
||||
"jetbrains-clion"
|
||||
"jetbrains-idea"
|
||||
"jetbrains-pycharm"
|
||||
"jetbrains-rustrover"
|
||||
"jetbrains-rider"
|
||||
"jetbrains-webstorm"
|
||||
"code-url-handler"
|
||||
"neovide"
|
||||
"steam"
|
||||
"ferdium"
|
||||
"Msty"
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
config,
|
||||
hyprland,
|
||||
color,
|
||||
}: {
|
||||
enable = !hyprland.caelestia.enable;
|
||||
|
||||
settings = {
|
||||
ipc = "on";
|
||||
splash = false;
|
||||
splash_offset = 2.0;
|
||||
|
||||
# Wallpapers have to be preloaded to be displayed
|
||||
preload = let
|
||||
mkPreload = name: "${config.paths.nixflake}/wallpapers/${name}.jpg";
|
||||
in
|
||||
color.wallpapers |> builtins.map mkPreload;
|
||||
|
||||
wallpaper = let
|
||||
mkWallpaper = monitor:
|
||||
"${monitor}, "
|
||||
+ "${config.paths.nixflake}/wallpapers/${color.wallpaper}.jpg";
|
||||
in
|
||||
hyprland.monitors
|
||||
|> builtins.attrNames
|
||||
|> builtins.map mkWallpaper;
|
||||
};
|
||||
}
|
||||
+5
@@ -5,8 +5,13 @@
|
||||
}: {
|
||||
enable = lib.mkEnableOption "Hyprland Window Manager + Compositor";
|
||||
|
||||
dunst.enable = lib.mkEnableOption "Enable Dunst notification daemon";
|
||||
bars.enable = lib.mkEnableOption "Enable window bars";
|
||||
dynamicCursor.enable = lib.mkEnableOption "Enable dynamic cursors";
|
||||
trails.enable = lib.mkEnableOption "Enable dynamic window trails";
|
||||
hyprspace.enable = lib.mkEnableOption "Enable Hyprspace workspace overview";
|
||||
hyprpanel.enable = lib.mkEnableOption "Enable Hyprpanel";
|
||||
caelestia.enable = lib.mkEnableOption "Enable Caelestia";
|
||||
|
||||
keyboard = {
|
||||
layout = lib.mkOption {
|
||||
+119
-5
@@ -137,12 +137,8 @@
|
||||
hyprland.windowrules
|
||||
];
|
||||
|
||||
render = {
|
||||
cm_enabled = true;
|
||||
cm_auto_hdr = true;
|
||||
};
|
||||
|
||||
dwindle = {
|
||||
pseudotile = true;
|
||||
preserve_split = true;
|
||||
};
|
||||
|
||||
@@ -241,5 +237,123 @@
|
||||
on_double_click = "hyprctl dispatch fullscreen 1";
|
||||
};
|
||||
})
|
||||
|
||||
(lib.optionalAttrs hyprland.dynamicCursor.enable {
|
||||
dynamic-cursors = {
|
||||
# enables the plugin
|
||||
enabled = true;
|
||||
|
||||
# sets the cursor behaviour, supports these values:
|
||||
# tilt - tilt the cursor based on x-velocity
|
||||
# rotate - rotate the cursor based on movement direction
|
||||
# stretch - stretch the cursor shape based on direction and velocity
|
||||
# none - do not change the cursors behaviour
|
||||
mode = "rotate";
|
||||
|
||||
# minimum angle difference in degrees after which the shape is changed
|
||||
# smaller values are smoother, but more expensive for hw cursors
|
||||
threshold = 2;
|
||||
|
||||
# for mode = rotate
|
||||
rotate = {
|
||||
# length in px of the simulated stick used to rotate the cursor
|
||||
# most realistic if this is your actual cursor size
|
||||
length = 20;
|
||||
|
||||
# clockwise offset applied to the angle in degrees
|
||||
# this will apply to ALL shapes
|
||||
offset = 0.0;
|
||||
};
|
||||
|
||||
# for mode = tilt
|
||||
tilt = {
|
||||
# controls how powerful the tilt is, the lower, the more power
|
||||
# this value controls at which speed (px/s) the full tilt is reached
|
||||
# the full tilt being 60° in both directions
|
||||
limit = 1000;
|
||||
|
||||
# relationship between speed and tilt, supports these values:
|
||||
# linear - a linear function is used
|
||||
# quadratic - a quadratic function is used (most realistic to actual air drag)
|
||||
# negative_quadratic - negative version of the quadratic one, feels more aggressive
|
||||
# see `activation` in `src/mode/utils.cpp` for how exactly the calculation is done
|
||||
function = "negative_quadratic";
|
||||
|
||||
# time window (ms) over which the speed is calculated
|
||||
# higher values will make slow motions smoother but more delayed
|
||||
window = 100;
|
||||
};
|
||||
|
||||
# configure shake to find
|
||||
# magnifies the cursor if its is being shaken
|
||||
shake = {
|
||||
# enables shake to find
|
||||
enabled = false;
|
||||
|
||||
# use nearest-neighbour (pixelated) scaling when shaking
|
||||
# may look weird when effects are enabled
|
||||
nearest = true;
|
||||
|
||||
# controls how soon a shake is detected
|
||||
# lower values mean sooner
|
||||
threshold = 3.0;
|
||||
|
||||
# magnification level immediately after shake start
|
||||
base = 1.5;
|
||||
# magnification increase per second when continuing to shake
|
||||
speed = 0.0;
|
||||
# how much the speed is influenced by the current shake intensitiy
|
||||
influence = 0.0;
|
||||
|
||||
# maximal magnification the cursor can reach
|
||||
# values below 1 disable the limit (e.g. 0)
|
||||
limit = 0.0;
|
||||
|
||||
# time in millseconds the cursor will stay magnified after a shake has ended
|
||||
timeout = 1000;
|
||||
|
||||
# show cursor behaviour `tilt`, `rotate`, etc. while shaking
|
||||
effects = true;
|
||||
|
||||
# enable ipc events for shake
|
||||
# see the `ipc` section below
|
||||
ipc = false;
|
||||
};
|
||||
|
||||
# use hyprcursor to get a higher resolution texture when the cursor is magnified
|
||||
# see the `hyprcursor` section below
|
||||
hyprcursor = {
|
||||
# use nearest-neighbour (pixelated) scaling when magnifing beyond texture size
|
||||
# this will also have effect without hyprcursor support being enabled
|
||||
# 0 / false - never use pixelated scaling
|
||||
# 1 / true - use pixelated when no highres image
|
||||
# 2 - always use pixleated scaling
|
||||
nearest = true;
|
||||
|
||||
# enable dedicated hyprcursor support
|
||||
enabled = true;
|
||||
|
||||
# resolution in pixels to load the magnified shapes at
|
||||
# be warned that loading a very high-resolution image will take a long time and might impact memory consumption
|
||||
# -1 means we use [normal cursor size] * [shake:base option]
|
||||
resolution = -1;
|
||||
|
||||
# shape to use when clientside cursors are being magnified
|
||||
# see the shape-name property of shape rules for possible names
|
||||
# specifying clientside will use the actual shape, but will be pixelated
|
||||
fallback = "clientside";
|
||||
};
|
||||
};
|
||||
})
|
||||
|
||||
(lib.optionalAttrs hyprland.trails.enable {
|
||||
hyprtrails = {
|
||||
color = "rgb(${color.hex.accent})";
|
||||
};
|
||||
})
|
||||
|
||||
(lib.optionalAttrs hyprland.hyprspace.enable {
|
||||
overview = {};
|
||||
})
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
# TODO: Expose some settings
|
||||
{
|
||||
config,
|
||||
nixosConfig,
|
||||
lib,
|
||||
mylib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
with mylib.modules; let
|
||||
cfg = config.homemodules.vscode;
|
||||
in {
|
||||
options.homemodules.vscode = import ./options.nix {inherit lib mylib;};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
programs.vscode = {
|
||||
enable = true;
|
||||
enableExtensionUpdateCheck = false;
|
||||
enableUpdateCheck = false;
|
||||
extensions = with pkgs.vscode-extensions; [
|
||||
# alefragnani.bookmarks # TODO: Use inline bookmarks instead
|
||||
# alefragnani.project-manager # NOTE: Not much sense with flake dev environments
|
||||
catppuccin.catppuccin-vsc
|
||||
catppuccin.catppuccin-vsc-icons
|
||||
christian-kohler.path-intellisense
|
||||
# codezombiech.gitignore # NOTE: Superfluous
|
||||
# coolbear.systemd-unit-file # NOTE: Unnecessary on NixOS
|
||||
eamodio.gitlens
|
||||
# formulahendry.auto-rename-tag
|
||||
# formulahendry.auto-close-tag
|
||||
# gitlab.gitlab-workflow
|
||||
# irongeek.vscode-env
|
||||
# jnoortheen.nix-ide
|
||||
# kamadorueda.alejandra
|
||||
# kamikillerto.vscode-colorize
|
||||
# llvm-vs-code-extensions.vscode-clangd
|
||||
# matklad.rust-analyzer
|
||||
mechatroner.rainbow-csv
|
||||
# mikestead.dotenv
|
||||
# mkhl.direnv
|
||||
# ms-azuretools.vscode-docker
|
||||
# ms-kubernetes-tools.vscode-kubernetes-tools
|
||||
ms-python.python
|
||||
ms-toolsai.jupyter
|
||||
ms-vscode.cmake-tools
|
||||
ms-vscode.cpptools
|
||||
# ms-vscode.hexeditor
|
||||
# ms-vscode.makefile-tools
|
||||
ms-python.black-formatter
|
||||
ms-python.vscode-pylance
|
||||
ms-vscode-remote.remote-ssh
|
||||
# naumovs.color-highlight
|
||||
njpwerner.autodocstring
|
||||
# james-yu.latex-workshop
|
||||
# redhat.java
|
||||
# redhat.vscode-xml
|
||||
# redhat.vscode-yaml
|
||||
ritwickdey.liveserver
|
||||
# rubymaniac.vscode-paste-and-indent
|
||||
ryu1kn.partial-diff
|
||||
# serayuzgur.crates
|
||||
shd101wyy.markdown-preview-enhanced
|
||||
# skyapps.fish-vscode
|
||||
# tamasfe.even-better-toml
|
||||
# timonwong.shellcheck
|
||||
# tomoki1207.pdf # Incompatible with latex workshop
|
||||
# valentjn.vscode-ltex
|
||||
vscodevim.vim
|
||||
vscode-icons-team.vscode-icons
|
||||
# yzhang.markdown-all-in-one
|
||||
];
|
||||
# haskell = {};
|
||||
# keybindings = {};
|
||||
|
||||
userSettings = {
|
||||
# VSCode Internals
|
||||
"editor.fontFamily" = "JetBrainsMono Nerd Font Mono";
|
||||
"editor.fontSize" = 16;
|
||||
"editor.renderWhitespace" = "selection";
|
||||
"editor.cursorStyle" = "line"; # Use line for vim plugin
|
||||
"editor.lineNumbers" = "relative";
|
||||
"editor.linkedEditing" = true;
|
||||
"editor.smoothScrolling" = true;
|
||||
"editor.stickyScroll.enabled" = true;
|
||||
"editor.tabCompletion" = "on";
|
||||
"editor.cursorSmoothCaretAnimation" = "on";
|
||||
"editor.cursorSurroundingLines" = 10;
|
||||
"editor.minimap.renderCharacters" = false;
|
||||
"editor.bracketPairColorization.enabled" = true;
|
||||
"editor.guides.bracketPairs" = "active";
|
||||
"editor.guides.bracketPairsHorizontal" = "active";
|
||||
"editor.guides.highlightActiveIndentation" = false;
|
||||
|
||||
"files.autoSave" = "onFocusChange";
|
||||
"files.trimFinalNewlines" = true;
|
||||
"files.trimTrailingWhitespace" = true; # NOTE: If this is enabled with frequent autosave, the current lines whitespace will always be removed, which is obnoxious
|
||||
|
||||
"window.restoreWindows" = "none";
|
||||
|
||||
"window.titleBarStyle" = "custom"; # NOTE: Should help with crashing on wayland
|
||||
# "window.titleBarStyle" = "native";
|
||||
# "window.menuBarVisibility" = "toggle";
|
||||
|
||||
"workbench.enableExperiments" = false;
|
||||
"workbench.list.smoothScrolling" = true;
|
||||
# "workbench.colorTheme" = "Default Light Modern";
|
||||
# "workbench.iconTheme" = "vscode-icons";
|
||||
"workbench.colorTheme" = "Catppuccin Latte";
|
||||
"workbench.iconTheme" = "catppuccin-latte";
|
||||
|
||||
"remote.SSH.configFile" = "~/.ssh/custom-config";
|
||||
|
||||
"security.workspace.trust.enabled" = false;
|
||||
|
||||
# Language Tool
|
||||
"ltex.checkFrequency" = "manual";
|
||||
|
||||
# LaTeX
|
||||
"latex-workshop.latex.tools" = [
|
||||
{
|
||||
"name" = "latexmk";
|
||||
"command" = "latexmk";
|
||||
"args" = [
|
||||
"-synctex=1"
|
||||
"-shell-escape"
|
||||
"-interaction=nonstopmode"
|
||||
"-file-line-error"
|
||||
"-pdf"
|
||||
"-outdir=%OUTDIR%"
|
||||
"%DOC%"
|
||||
];
|
||||
"env" = {};
|
||||
}
|
||||
];
|
||||
"latex-workshop.latexindent.args" = [
|
||||
"-c"
|
||||
"%DIR%/"
|
||||
"%TMPFILE%"
|
||||
"-m"
|
||||
"-y=defaultIndent: '%INDENT%'"
|
||||
];
|
||||
|
||||
# Nix
|
||||
"[nix]"."editor.tabSize" = 2;
|
||||
"nix.enableLanguageServer" = true;
|
||||
"nix.serverPath" = "nil";
|
||||
"nix.formatterPath" = "alejandra";
|
||||
|
||||
# C++
|
||||
# "C_Cpp.intelliSenseEngine" = "disabled"; # IntelliSense conflics with Clangd
|
||||
};
|
||||
# TODO: Snippets
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -57,7 +57,7 @@ in {
|
||||
|
||||
fetchart = {
|
||||
auto = "yes";
|
||||
sources = "*"; # sources are queried in this order
|
||||
sources = "filesystem coverart itunes amazon albumart"; # sources are queried in this order
|
||||
};
|
||||
|
||||
# lyrics = {
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
./fastfetch
|
||||
./fish
|
||||
./git
|
||||
./jellyfin-tui
|
||||
./kitty
|
||||
./lazygit
|
||||
./neovim
|
||||
|
||||
@@ -15,10 +15,6 @@
|
||||
./firefox
|
||||
./fish
|
||||
./git
|
||||
./helix
|
||||
./hyprland
|
||||
./hyprpanel
|
||||
./jellyfin-tui
|
||||
./kitty
|
||||
./lazygit
|
||||
./mpd
|
||||
@@ -34,19 +30,14 @@
|
||||
./ssh
|
||||
./terminal
|
||||
./tmux
|
||||
./vscode
|
||||
./yazi
|
||||
./zathura
|
||||
./zed
|
||||
|
||||
# HM modules imported from the flake inputs
|
||||
inputs.nix-flatpak.homeManagerModules.nix-flatpak
|
||||
inputs.nixvim.homeModules.nixvim
|
||||
inputs.textfox.homeManagerModules.default
|
||||
inputs.walker.homeManagerModules.default
|
||||
inputs.codex-desktop-linux.homeManagerModules.default
|
||||
# inputs.stylix.homeModules.stylix
|
||||
# inputs.direnv-instant.homeModules.direnv-instant
|
||||
# inputs.niri.homeModules.niri # Imported by system module
|
||||
# inputs.noctalia.homeModules.default
|
||||
# inputs.caelestia.homeManagerModules.default
|
||||
|
||||
@@ -32,9 +32,6 @@ in {
|
||||
"Notes/Obsidian/Chriphost/latex_snippets.json".source = ../../../config/obsidian/latex_snippets.json; # TODO: Symlink
|
||||
"Notes/Obsidian/Chriphost/.obsidian/snippets/latex_preview.css".source = ../../../config/obsidian/css_snippets/latex_preview.css;
|
||||
"Notes/Obsidian/Chriphost/.obsidian/snippets/center_image.css".source = ../../../config/obsidian/css_snippets/center_image.css;
|
||||
"Notes/Obsidian/Chriphost/.obsidian/snippets/fullwidth_image.css".source = ../../../config/obsidian/css_snippets/fullwidth_image.css;
|
||||
"Notes/Obsidian/Chriphost/.obsidian/snippets/justify_text.css".source = ../../../config/obsidian/css_snippets/justify_text.css;
|
||||
"Notes/Obsidian/Chriphost/.obsidian/snippets/bordered_image.css".source = ../../../config/obsidian/css_snippets/bordered_image.css;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -63,7 +63,7 @@ in [
|
||||
# Coding
|
||||
|
||||
{
|
||||
name = "Code";
|
||||
name = "Coding";
|
||||
bookmarks = [
|
||||
(mkBm "C++Ref" "https://en.cppreference.com/w/")
|
||||
(mkBm "Rust" "https://doc.rust-lang.org/stable/book/ch03-00-common-programming-concepts.html")
|
||||
@@ -72,21 +72,21 @@ in [
|
||||
(mkBm "Godbolt" "https://godbolt.org")
|
||||
];
|
||||
}
|
||||
# {
|
||||
# name = "AI";
|
||||
# bookmarks = [
|
||||
# (mkBm "Mistral Chat" "https://chat.mistral.ai/chat")
|
||||
# (mkBm "DeepSeek Chat" "https://chat.deepseek.com/")
|
||||
# (mkBm "Claude Chat" "https://claude.ai/new")
|
||||
# (mkBm "ChatGPT" "https://chatgpt.com/")
|
||||
# (mkBm "DeepWiki" "https://deepwiki.com/")
|
||||
# "separator"
|
||||
# (mkBm "Mistral API" "https://console.mistral.ai/usage")
|
||||
# (mkBm "DeepSeek API" "https://platform.deepseek.com/usage")
|
||||
# (mkBm "Claude API" "https://console.anthropic.com/usage")
|
||||
# (mkBm "OpenRouter API" "https://openrouter.ai/activity")
|
||||
# ];
|
||||
# }
|
||||
{
|
||||
name = "\"AI\"";
|
||||
bookmarks = [
|
||||
(mkBm "Mistral Chat" "https://chat.mistral.ai/chat")
|
||||
(mkBm "DeepSeek Chat" "https://chat.deepseek.com/")
|
||||
(mkBm "Claude Chat" "https://claude.ai/new")
|
||||
(mkBm "ChatGPT" "https://chatgpt.com/")
|
||||
(mkBm "DeepWiki" "https://deepwiki.com/")
|
||||
"separator"
|
||||
(mkBm "Mistral API" "https://console.mistral.ai/usage")
|
||||
(mkBm "DeepSeek API" "https://platform.deepseek.com/usage")
|
||||
(mkBm "Claude API" "https://console.anthropic.com/usage")
|
||||
(mkBm "OpenRouter API" "https://openrouter.ai/activity")
|
||||
];
|
||||
}
|
||||
(mkBm "GH" "https://github.com/churl")
|
||||
(mkBm "GL" "https://gitlab.com/churl")
|
||||
(mkBm "SO" "https://stackoverflow.com/users/saves/17337508/all")
|
||||
@@ -103,9 +103,9 @@ in [
|
||||
(mkBm "Heise" "https://www.heise.de/")
|
||||
(mkBm "HN" "https://news.ycombinator.com/news")
|
||||
(mkBm "Reddit" "https://www.reddit.com/user/FightingMushroom/saved/")
|
||||
# (mkBm "F10" "https://f10.local.chriphost.de/race/Everyone")
|
||||
(mkBm "F12" "https://f12.local.chriphost.gay/racepicks")
|
||||
(mkBm "F12PB" "https://f12pb.local.chriphost.de/_/")
|
||||
(mkBm "F10" "https://f10.local.chriphost.de/race/Everyone")
|
||||
(mkBm "F11" "https://f11.local.chriphost.de/racepicks")
|
||||
(mkBm "F11PB" "https://f11pb.local.chriphost.de/_/#/collections?collection=pbc_1736455494&filter=&sort=-%40rowid")
|
||||
(mkBm "ISBNDB" "https://isbndb.com/")
|
||||
(mkBm "Music" "https://bandcamp.com/chriphost")
|
||||
(mkBm "Albums" "https://www.albumoftheyear.org/user/chriphost/list/307966/2025/")
|
||||
|
||||
@@ -86,9 +86,6 @@ in {
|
||||
programs.firefox = {
|
||||
enable = true;
|
||||
|
||||
# configPath = "${config.xdg.configHome}/mozilla/firefox";
|
||||
configPath = "${config.home.homeDirectory}/.mozilla/firefox";
|
||||
|
||||
# firefox-unwrapped is the pure firefox browser, wrapFirefox adds configuration ontop
|
||||
package = pkgs.wrapFirefox pkgs.firefox-unwrapped {
|
||||
# About policies: https://github.com/mozilla/policy-templates#enterprisepoliciesenabled
|
||||
|
||||
@@ -58,7 +58,7 @@ in {
|
||||
in
|
||||
lib.mkMerge [
|
||||
# Darwin exclusive config
|
||||
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin {
|
||||
(lib.mkIf pkgs.stdenv.isDarwin {
|
||||
shellInit = ''
|
||||
set fish_greeting
|
||||
yes | fish_config theme save "system-theme"
|
||||
@@ -81,53 +81,12 @@ in {
|
||||
})
|
||||
|
||||
# Linux exclusive config
|
||||
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux {
|
||||
(lib.mkIf pkgs.stdenv.isLinux {
|
||||
generateCompletions = nixosConfig.programs.fish.generateCompletions;
|
||||
|
||||
# TODO: There's a bug with the direnv mechanism:
|
||||
# - When leaving an env, it unloads (good)
|
||||
# - When entering another env, it loads (good)
|
||||
# - When leaving this one, it doesn't unload (bad)
|
||||
# - When entering leaving it again, it works...
|
||||
# This only happens sometimes, is there a race condition?
|
||||
shellInit = ''
|
||||
set fish_greeting
|
||||
yes | fish_config theme save "system-theme"
|
||||
fish_vi_key_bindings
|
||||
|
||||
# Because we can't source that in a project flake's shellHook (is POSIX), source it here
|
||||
function __project_shell_reload --on-variable INIT_PROJECT_SHELL
|
||||
# Leaving the environment
|
||||
if not set -q INIT_PROJECT_SHELL; or test -z "$INIT_PROJECT_SHELL"
|
||||
if test -n "$__last_unload_project_shell"; and test -f "$__last_unload_project_shell"
|
||||
source "$__last_unload_project_shell"
|
||||
end
|
||||
set -e __last_init_project_shell
|
||||
set -e __last_unload_project_shell
|
||||
return
|
||||
end
|
||||
|
||||
# Entering or switching environments
|
||||
if test "$INIT_PROJECT_SHELL" != "$__last_init_project_shell"
|
||||
# Cleanup the previous environment
|
||||
if test -n "$__last_unload_project_shell"; and test -f "$__last_unload_project_shell"
|
||||
source "$__last_unload_project_shell"
|
||||
end
|
||||
|
||||
# Store into variables to persist until next environment switch in the same shell
|
||||
set -g __last_init_project_shell "$INIT_PROJECT_SHELL"
|
||||
if set -q UNLOAD_PROJECT_SHELL; and test -f "$UNLOAD_PROJECT_SHELL"
|
||||
set -g __last_unload_project_shell "$UNLOAD_PROJECT_SHELL"
|
||||
else
|
||||
set -e __last_unload_project_shell
|
||||
end
|
||||
|
||||
# Source the new environment
|
||||
if test -f "$INIT_PROJECT_SHELL"
|
||||
source "$INIT_PROJECT_SHELL"
|
||||
end
|
||||
end
|
||||
end
|
||||
'';
|
||||
|
||||
functions = lib.mergeAttrsList [
|
||||
@@ -221,10 +180,6 @@ in {
|
||||
ns = "nix shell nixpkgs#";
|
||||
nr = "nix run";
|
||||
nps = "nps -e";
|
||||
|
||||
# Systemctl
|
||||
st = "sudo systemctl-tui";
|
||||
sf = "systemctl --failed";
|
||||
}
|
||||
|
||||
# Abbrs only available if package is installed
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
{
|
||||
inputs,
|
||||
config,
|
||||
lib,
|
||||
mylib,
|
||||
pkgs,
|
||||
nixosConfig,
|
||||
username,
|
||||
...
|
||||
}: let
|
||||
inherit (config.homemodules) hyprland color;
|
||||
|
||||
# Autostart programs
|
||||
always-exec = import ./autostart.nix {inherit lib pkgs config hyprland;};
|
||||
|
||||
# Keybindings
|
||||
always-bind = import ./mappings.nix {inherit lib config hyprland;};
|
||||
|
||||
# Mousebindings
|
||||
always-bindm = {
|
||||
"$mainMod, mouse:272" = ["movewindow"];
|
||||
"$mainMod, mouse:273" = ["resizewindow"];
|
||||
};
|
||||
in {
|
||||
options.homemodules.hyprland = import ./options.nix {inherit lib mylib;};
|
||||
|
||||
config = lib.mkIf hyprland.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = nixosConfig.programs.hyprland.enable;
|
||||
message = "Can't enable Hyprland module with Hyprland disabled!";
|
||||
}
|
||||
{
|
||||
assertion = builtins.hasAttr "hyprlock" nixosConfig.security.pam.services;
|
||||
message = "Can't enable Hyprland module without Hyprlock PAM service!";
|
||||
}
|
||||
];
|
||||
|
||||
gtk = {
|
||||
enable = true;
|
||||
iconTheme.package = lib.mkDefault color.iconPackage;
|
||||
iconTheme.name = color.iconTheme;
|
||||
};
|
||||
|
||||
homemodules = {
|
||||
hyprpanel.enable = hyprland.hyprpanel.enable;
|
||||
};
|
||||
|
||||
home = {
|
||||
pointerCursor = {
|
||||
enable = true;
|
||||
gtk.enable = lib.mkDefault true;
|
||||
x11.enable = lib.mkDefault true;
|
||||
package = lib.mkDefault color.cursorPackage;
|
||||
name = color.cursor;
|
||||
size = color.cursorSize;
|
||||
};
|
||||
|
||||
packages = with pkgs; [
|
||||
hyprpicker # Color picker
|
||||
# hyprpolkitagent # Ugly polkit authentication GUI
|
||||
hyprland-qt-support
|
||||
hyprsunset # Blue light filter
|
||||
|
||||
wl-clipboard
|
||||
# clipman # Clipboard manager (wl-paste)
|
||||
libnotify
|
||||
inotify-tools # Includes inotifywait
|
||||
|
||||
# ncpamixer # Audio control
|
||||
slurp # Region selector for screensharing
|
||||
grim # Grab images from compositor
|
||||
|
||||
# Deps for Qt5 and Qt6 apps (e.g., Nextcloud)
|
||||
qt5.qtwayland
|
||||
qt6.qtwayland
|
||||
|
||||
# xwayland
|
||||
# wayland-protocols
|
||||
];
|
||||
};
|
||||
|
||||
programs = {
|
||||
hyprlock = import ./hyprlock.nix {inherit config hyprland color;};
|
||||
};
|
||||
|
||||
services = {
|
||||
hypridle = import ./hypridle.nix {inherit config hyprland color;};
|
||||
};
|
||||
|
||||
# Make sure the units only start when using Hyprland
|
||||
systemd.user.services.hypridle.Install.WantedBy = lib.mkForce ["hyprland-session.target"];
|
||||
systemd.user.services.hypridle.Unit.After = lib.mkForce ["hyprland-session.target"];
|
||||
systemd.user.services.hypridle.Unit.PartOf = lib.mkForce ["hyprland-session.target"];
|
||||
systemd.user.services.elephant.Install.WantedBy = lib.mkForce ["hyprland-session.target" "graphical-session.target"];
|
||||
systemd.user.services.elephant.Unit.After = lib.mkForce ["hyprland-session.target" "graphical-session.target"];
|
||||
systemd.user.services.elephant.Unit.PartOf = lib.mkForce ["hyprland-session.target" "graphical-session.target"];
|
||||
|
||||
wayland.windowManager.hyprland = {
|
||||
enable = true;
|
||||
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
|
||||
portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
|
||||
configType = "hyprlang";
|
||||
|
||||
systemd.enable = true; # Enable hyprland-session.target
|
||||
systemd.variables = ["--all"]; # Import PATH into systemd
|
||||
xwayland.enable = true;
|
||||
|
||||
settings = import ./settings.nix {
|
||||
inherit
|
||||
lib
|
||||
config
|
||||
hyprland
|
||||
color
|
||||
always-exec
|
||||
always-bind
|
||||
always-bindm
|
||||
;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,91 +0,0 @@
|
||||
{
|
||||
config,
|
||||
nixosConfig,
|
||||
darwinConfig,
|
||||
lib,
|
||||
mylib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
inherit (config.homemodules) jellyfin-tui color;
|
||||
|
||||
systemConfig =
|
||||
if pkgs.stdenv.hostPlatform.isLinux
|
||||
then nixosConfig
|
||||
else darwinConfig;
|
||||
in {
|
||||
options.homemodules.jellyfin-tui = import ./options.nix {inherit lib mylib;};
|
||||
|
||||
config = lib.mkIf jellyfin-tui.enable {
|
||||
home = {
|
||||
packages = [
|
||||
pkgs.jellyfin-tui
|
||||
];
|
||||
|
||||
file = let
|
||||
jellyfinUrl =
|
||||
if pkgs.stdenv.hostPlatform.isLinux
|
||||
then "https://jellyfin.local.chriphost.de"
|
||||
else "https://jellyfin.vps.chriphost.de";
|
||||
|
||||
configFile = ''
|
||||
servers:
|
||||
- name: Mafia Dortmund
|
||||
url: ${jellyfinUrl}
|
||||
username: root
|
||||
password_file: ${systemConfig.sops.secrets.jellyfin-password.path}
|
||||
default: true
|
||||
|
||||
# All following settings are OPTIONAL. What you see here are the defaults.
|
||||
|
||||
# Show album cover image
|
||||
art: true
|
||||
# Save and restore the state of the player (queue, volume, etc.)
|
||||
persist: true
|
||||
# Grab the primary color from the cover image (false => uses the current theme's `accent` instead)
|
||||
auto_color: false
|
||||
# Time in milliseconds to fade between colors when the track changes
|
||||
auto_color_fade_ms: 400
|
||||
# Always show the lyrics pane, even if no lyrics are available
|
||||
lyrics: 'always' # options: 'always', 'never', 'auto'
|
||||
|
||||
rounded_corners: true
|
||||
|
||||
transcoding:
|
||||
bitrate: 320
|
||||
# container: mp3
|
||||
|
||||
# Discord Rich Presence. Shows your listening status on your Discord profile if Discord is running.
|
||||
# NOTE: I think we're allowed to leak this to the public (hopefully)?
|
||||
discord: 1466134677537685546 # https://discord.com/developers/applications
|
||||
# Displays album art on your Discord profile if enabled
|
||||
# !!CAUTION!! - Enabling this will expose the URL of your Jellyfin instance to all Discord users!
|
||||
discord_art: false
|
||||
|
||||
# Customize the title of the terminal window
|
||||
window_title: true # default -> {title} – {artist} ({year})
|
||||
# window_title: false # disable
|
||||
# Custom title: choose from current track's {title} {artist} {album} {year}
|
||||
# window_title: "\"{title}\" by {artist} ({year}) – jellyfin-tui"
|
||||
|
||||
# Options specified here will be passed to mpv - https://mpv.io/manual/master/#options
|
||||
mpv:
|
||||
log-file: /tmp/mpv.log
|
||||
no-config: true
|
||||
# af: lavfi=[loudnorm=I=-23:TP=-1]
|
||||
gapless-audio: weak
|
||||
prefetch-playlist: yes
|
||||
replaygain: no
|
||||
'';
|
||||
in
|
||||
lib.mkMerge [
|
||||
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
|
||||
".config/jellyfin-tui/config.yaml".text = configFile;
|
||||
})
|
||||
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isDarwin {
|
||||
"Library/Application Support/jellyfin-tui/config.yaml".text = configFile;
|
||||
})
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
mylib,
|
||||
...
|
||||
}: {
|
||||
enable = lib.mkEnableOption "Enable jellyfin-tui";
|
||||
}
|
||||
@@ -26,19 +26,13 @@ in {
|
||||
"kitty_mod+j" = "next_window";
|
||||
"kitty_mod+k" = "previous_window";
|
||||
"kitty_mod+l" = "next_layout";
|
||||
"kitty_mod+p" = "command_palette";
|
||||
|
||||
"kitty_mod+c" = "copy_to_clipboard";
|
||||
"ctrl+c" = "copy_or_interrupt";
|
||||
"kitty_mod+v" = "paste_from_clipboard";
|
||||
"ctrl+v" = "paste_from_clipboard";
|
||||
};
|
||||
|
||||
settings = lib.mkMerge [
|
||||
# Linux config
|
||||
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux {
|
||||
allow_remote_control = true; # For nnn file preview or nvim scrollback
|
||||
listen_on = lib.mkDefault "unix:@mykitty"; # This conflicts with direnv-instant
|
||||
(lib.mkIf pkgs.stdenv.isLinux {
|
||||
allow_remote_control = "yes"; # For nnn file preview or nvim scrollback
|
||||
listen_on = "unix:@mykitty";
|
||||
})
|
||||
|
||||
# Common config
|
||||
@@ -48,7 +42,6 @@ in {
|
||||
window_padding_width = 10; # Looks stupid with editors if bg doesn't match
|
||||
# hide_window_decorations = "yes";
|
||||
enabled_layouts = "grid,vertical,horizontal";
|
||||
cursor_trail = 3;
|
||||
|
||||
tab_bar_min_tabs = 2; # Don't show a single tab
|
||||
tab_bar_edge = "bottom";
|
||||
|
||||
@@ -30,62 +30,54 @@ in {
|
||||
|
||||
(lib.optionals (!headless) [
|
||||
# Language servers
|
||||
autotools-language-server
|
||||
basedpyright
|
||||
clang-tools
|
||||
clojure-lsp
|
||||
cmake-language-server
|
||||
haskell-language-server
|
||||
jdt-language-server
|
||||
just-lsp
|
||||
ltex-ls # TODO: Only enable on-demand
|
||||
lua-language-server
|
||||
nil
|
||||
# perl5Packages.PLS
|
||||
perlnavigator
|
||||
# nil
|
||||
basedpyright
|
||||
pyrefly
|
||||
# rPackages.languageserver
|
||||
ty
|
||||
rust-analyzer
|
||||
svelte-language-server
|
||||
tailwindcss-language-server
|
||||
tex-fmt
|
||||
texlab
|
||||
tinymist
|
||||
ty
|
||||
typescript
|
||||
vscode-langservers-extracted # includes nodejs
|
||||
autotools-language-server
|
||||
just-lsp
|
||||
|
||||
# Linters
|
||||
checkstyle # java
|
||||
clippy # rust
|
||||
clj-kondo # clojure
|
||||
eslint_d # javascript
|
||||
# python313Packages.ruff
|
||||
# python313Packages.flake8
|
||||
# python313Packages.pylint
|
||||
python313Packages.ruff
|
||||
python313Packages.flake8
|
||||
python313Packages.pylint
|
||||
lua54Packages.luacheck
|
||||
vale # text
|
||||
# statix # nix (doesn't recognize pipe operator)
|
||||
|
||||
# Formatters
|
||||
air-formatter
|
||||
cljfmt
|
||||
python313Packages.black
|
||||
google-java-format
|
||||
html-tidy
|
||||
jq # json
|
||||
just-formatter
|
||||
mbake
|
||||
# nodePackages_latest.prettier # Use local install as plugins change per project
|
||||
# perl5Packages.PerlTidy
|
||||
# prettierd # Use prettier instead because of plugins
|
||||
# python313Packages.black
|
||||
# nodePackages_latest.prettier # Use local install as plugins change per project
|
||||
rustfmt
|
||||
stylua
|
||||
tombi
|
||||
typstyle
|
||||
|
||||
nodejs_latest
|
||||
uv
|
||||
mbake
|
||||
just-formatter
|
||||
tombi
|
||||
])
|
||||
|
||||
[
|
||||
@@ -95,54 +87,6 @@ in {
|
||||
lua54Packages.jsregexp # For tree-sitter
|
||||
# nodejs_latest
|
||||
|
||||
# TODO: Create a perl module where I can add packages to, so I don't end up with multiple perl installations
|
||||
# TODO: The same is required for python and R (below)
|
||||
(perl.withPackages (p:
|
||||
with p; [
|
||||
PLS
|
||||
PerlCritic
|
||||
PerlTidy
|
||||
NetOpenSSH
|
||||
DateTime
|
||||
DBI
|
||||
DBDMariaDB
|
||||
CursesUI
|
||||
TextCSV_XS
|
||||
]))
|
||||
|
||||
(python314.withPackages (p:
|
||||
with p; [
|
||||
# Linters
|
||||
ruff
|
||||
flake8
|
||||
pylint
|
||||
|
||||
# Formatters
|
||||
black
|
||||
|
||||
numpy
|
||||
matplotlib
|
||||
requests
|
||||
pygments
|
||||
pyyaml
|
||||
]))
|
||||
|
||||
(rWrapper.override {
|
||||
packages = with rPackages; [
|
||||
languageserver
|
||||
ggplot2
|
||||
ggalluvial
|
||||
plotly
|
||||
shiny
|
||||
readr
|
||||
tibble
|
||||
svglite
|
||||
dplyr
|
||||
tidyr
|
||||
scales
|
||||
];
|
||||
})
|
||||
|
||||
nixd
|
||||
alejandra # nix
|
||||
]
|
||||
@@ -150,8 +94,6 @@ in {
|
||||
};
|
||||
|
||||
programs.nixvim = {
|
||||
# nixpkgs.pkgs = pkgs;
|
||||
|
||||
defaultEditor = true;
|
||||
enable = true;
|
||||
enableMan = false; # Nixvim man pages
|
||||
@@ -159,15 +101,6 @@ in {
|
||||
viAlias = neovim.alias;
|
||||
vimAlias = neovim.alias;
|
||||
|
||||
# extraPackages = let
|
||||
# yazi-termfix = pkgs.writeShellScriptBin "yazi" ''
|
||||
# export TERM=xterm-kitty
|
||||
# exec ${pkgs.yazi}/bin/yazi "@$"
|
||||
# '';
|
||||
# in [
|
||||
# yazi-termfix
|
||||
# ];
|
||||
|
||||
# Configured using plugin
|
||||
# colorschemes.catppuccin = {
|
||||
# enable = true;
|
||||
@@ -183,7 +116,7 @@ in {
|
||||
performance.byteCompileLua = {
|
||||
enable = true;
|
||||
configs = true;
|
||||
initLua = true; # When debugging init.lua turn this off
|
||||
initLua = false; # When debugging init.lua turn this off
|
||||
nvimRuntime = true;
|
||||
plugins = true;
|
||||
};
|
||||
@@ -226,16 +159,6 @@ in {
|
||||
# fg = "#${color.hex.dark.text}";
|
||||
# bold = false;
|
||||
# };
|
||||
# NeoTreeNormal = {bg = "#${color.hex.base}";};
|
||||
# NeoTreeNormalNC = {bg = "#${color.hex.base}";};
|
||||
# NeoTreeWinSeparator = {
|
||||
# fg = "#${color.hex.crust}";
|
||||
# bg = "#${color.hex.base}";
|
||||
# };
|
||||
# NeoTreeVertSplit = {
|
||||
# fg = "#${color.hex.crust}";
|
||||
# bg = "#${color.hex.base}";
|
||||
# };
|
||||
};
|
||||
|
||||
# extraLuaPackages = with pkgs.lua51Packages; [];
|
||||
@@ -253,7 +176,7 @@ in {
|
||||
# local renderer = require("neo-tree.ui.renderer")
|
||||
# local state = manager.get_state("filesystem")
|
||||
# local window_exists = renderer.window_exists(state)
|
||||
#
|
||||
|
||||
# if window_exists then
|
||||
# require("neo-tree.sources.filesystem.commands").refresh(state)
|
||||
# end
|
||||
@@ -329,15 +252,6 @@ in {
|
||||
require("${name}").setup(opts)
|
||||
end
|
||||
'';
|
||||
|
||||
# Like mkDefaultConfig but takes the Lua module name explicitly.
|
||||
# Use when the Lua module name (e.g. "noice") differs from what
|
||||
# lazy.nvim expects as the plugin name (e.g. "noice.nvim").
|
||||
mkDefaultConfigFor = moduleName: ''
|
||||
function(_, opts)
|
||||
require("${moduleName}").setup(opts)
|
||||
end
|
||||
'';
|
||||
in {
|
||||
enable = true;
|
||||
|
||||
@@ -387,7 +301,6 @@ in {
|
||||
light = "latte";
|
||||
dark = "mocha";
|
||||
};
|
||||
term_colors = true;
|
||||
# https://github.com/catppuccin/nvim/tree/main?tab=readme-ov-file#integrations
|
||||
default_integrations = true;
|
||||
integrations = {
|
||||
@@ -424,7 +337,6 @@ in {
|
||||
# custom_bg = "crust";
|
||||
};
|
||||
notify = true;
|
||||
terminal = true;
|
||||
treesitter = true;
|
||||
ufo = true;
|
||||
rainbow_delimiters = true;
|
||||
@@ -436,15 +348,6 @@ in {
|
||||
};
|
||||
which_key = true;
|
||||
};
|
||||
|
||||
highlight_overrides.mocha.__raw = ''
|
||||
function(colors)
|
||||
return {
|
||||
NeoTreeWinSeparator = { fg = colors.crust, bg = colors.base, },
|
||||
NeoTreeVertSplit = { fg = colors.crust, bg = colors.base, },
|
||||
}
|
||||
end
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
@@ -466,7 +369,6 @@ in {
|
||||
# pkg = inputs.blink-cmp.packages.${system}.default;
|
||||
pkg = pkgs.vimPlugins.blink-cmp;
|
||||
lazy = true;
|
||||
dependencies = [luasnip];
|
||||
event = ["InsertEnter"];
|
||||
config = mkDefaultConfig name;
|
||||
|
||||
@@ -514,17 +416,13 @@ in {
|
||||
};
|
||||
};
|
||||
|
||||
snippets = {
|
||||
preset = "luasnip";
|
||||
};
|
||||
|
||||
fuzzy = {
|
||||
frecency.enabled = true;
|
||||
use_proximity = true;
|
||||
};
|
||||
|
||||
sources = {
|
||||
default = ["lsp" "path" "snippets" "omni"]; # No "buffer"
|
||||
default = ["lsp" "path" "snippets"]; # No "buffer"
|
||||
};
|
||||
|
||||
cmdline = {
|
||||
@@ -625,10 +523,8 @@ in {
|
||||
make = ["bake"];
|
||||
markdown = ["prettierd" "prettier"];
|
||||
nix = ["alejandra"];
|
||||
perl = ["perltidy"];
|
||||
python = ["black"];
|
||||
qml = ["qmlformat"];
|
||||
r = ["air"];
|
||||
rust = ["rustfmt"];
|
||||
svelte = ["prettierd" "prettier"];
|
||||
toml = ["tombi"];
|
||||
@@ -964,8 +860,9 @@ in {
|
||||
dependencies = [_lazydev];
|
||||
config = let
|
||||
servers = mylib.generators.toLuaObject [
|
||||
{name = "autotools-language-server";}
|
||||
{name = "basedpyright";}
|
||||
# {name = "pyrefly";} # TODO: Config
|
||||
# {name = "ty";} # TODO: Config
|
||||
{
|
||||
name = "clangd";
|
||||
extraOptions = {
|
||||
@@ -1008,15 +905,16 @@ in {
|
||||
{name = "html";} # vscode-langservers-extracted
|
||||
{name = "just";}
|
||||
{name = "lua_ls";}
|
||||
# {
|
||||
# name = "ltex";
|
||||
# extraOptions.settings = {
|
||||
# ltex = {
|
||||
# checkFrequency = "save";
|
||||
# enabled = ["markdown" "org" "tex" "latex" "plaintext"];
|
||||
# };
|
||||
# };
|
||||
# }
|
||||
{
|
||||
name = "ltex";
|
||||
extraOptions.settings = {
|
||||
ltex = {
|
||||
checkFrequency = "save";
|
||||
enabled = ["markdown" "org" "tex" "latex" "plaintext"];
|
||||
};
|
||||
};
|
||||
}
|
||||
{name = "autotools-language-server";}
|
||||
# {name = "nil_ls";}
|
||||
{
|
||||
name = "nixd";
|
||||
@@ -1058,8 +956,6 @@ in {
|
||||
};
|
||||
};
|
||||
}
|
||||
{name = "perlpls";}
|
||||
{name = "perlnavigator";}
|
||||
{
|
||||
name = "qmlls";
|
||||
extraOptions.cmd = [
|
||||
@@ -1067,8 +963,6 @@ in {
|
||||
"-E" # Use QML_IMPORT_PATH env variable
|
||||
];
|
||||
}
|
||||
# {name = "pyrefly";} # TODO: Config
|
||||
{name = "r_language_server";}
|
||||
{name = "svelte";}
|
||||
{name = "tailwindcss";}
|
||||
{name = "texlab";}
|
||||
@@ -1080,7 +974,6 @@ in {
|
||||
semanticTokens = "disable";
|
||||
};
|
||||
}
|
||||
# {name = "ty";} # TODO: Config
|
||||
|
||||
# {name = "jdtls";} # Don't set up when using nvim-jdtls
|
||||
# {name = "rust_analyzer";} # Don't set up when using rustaceanvim
|
||||
@@ -1158,7 +1051,6 @@ in {
|
||||
pkg = pkgs.vimPlugins.lualine-nvim;
|
||||
lazy = true;
|
||||
event = ["BufReadPost" "BufNewFile"];
|
||||
# dependencies = [opencode];
|
||||
config = ''
|
||||
function(_, opts)
|
||||
local lualine = require("lualine")
|
||||
@@ -1258,7 +1150,6 @@ in {
|
||||
lualine_c.__raw = ''{}''; # Use __raw: Nixvim does nothing with "[]", so the default config would be used
|
||||
|
||||
lualine_x.__raw = ''{}'';
|
||||
# lualine_x.__raw = ''{ { require("opencode").statusline, }, }'';
|
||||
lualine_y = ["filetype" "encoding" "fileformat"];
|
||||
lualine_z.__raw = ''{ { "location", separator = {}, } }'';
|
||||
};
|
||||
@@ -1424,19 +1315,19 @@ in {
|
||||
};
|
||||
|
||||
_nui = {
|
||||
name = "nui.nvim";
|
||||
name = "nui"; # For noice
|
||||
pkg = pkgs.vimPlugins.nui-nvim;
|
||||
lazy = true;
|
||||
};
|
||||
|
||||
noice = rec {
|
||||
name = "noice.nvim";
|
||||
name = "noice";
|
||||
pkg = pkgs.vimPlugins.noice-nvim;
|
||||
lazy = false;
|
||||
dependencies = [
|
||||
_nui
|
||||
];
|
||||
config = mkDefaultConfigFor "noice";
|
||||
config = mkDefaultConfig name;
|
||||
opts = {
|
||||
presets = {
|
||||
bottom_search = false;
|
||||
@@ -1498,32 +1389,6 @@ in {
|
||||
};
|
||||
};
|
||||
|
||||
opencode = {
|
||||
name = "opencode";
|
||||
pkg = pkgs.vimPlugins.opencode-nvim;
|
||||
lazy = false;
|
||||
config = ''
|
||||
function()
|
||||
vim.g.opencode_opts = {
|
||||
server = {
|
||||
url = "http://localhost:12345",
|
||||
start = false,
|
||||
},
|
||||
events = {
|
||||
permissions = {
|
||||
edits = {
|
||||
-- Disable neovim diff popup tab
|
||||
enabled = false,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
vim.o.autoread = true -- Required for `vim.g.opencode_opts.events.reload`
|
||||
end
|
||||
'';
|
||||
};
|
||||
|
||||
# obsidian = rec {
|
||||
# name = "obsidian";
|
||||
# pkg = pkgs.vimPlugins.obsidian-nvim;
|
||||
@@ -1748,7 +1613,7 @@ in {
|
||||
gitbrowse.enabled = false;
|
||||
image.enabled = false;
|
||||
indent.enabled = false;
|
||||
input.enabled = true;
|
||||
input.enabled = false;
|
||||
keymap.enabled = false;
|
||||
layout.enabled = false;
|
||||
lazygit.enabled = true;
|
||||
@@ -1784,20 +1649,6 @@ in {
|
||||
truncate = 80;
|
||||
};
|
||||
};
|
||||
|
||||
actions = {
|
||||
opencode_send.__raw = ''
|
||||
function(picker)
|
||||
local items = vim.tbl_map(function(item)
|
||||
return item.file
|
||||
and require("opencode").format({ path = item.file, from = item.pos, to = item.end_pos })
|
||||
or item.text
|
||||
end, picker:selected({ fallback = true }))
|
||||
|
||||
require("opencode").prompt(table.concat(items, ", ") .. " ")
|
||||
end
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
profiler.enabled = false;
|
||||
@@ -1828,7 +1679,6 @@ in {
|
||||
function(line)
|
||||
local base = { fg = "#${color.hex.base}", bg = "#${color.hex.base}" }
|
||||
local crust = { fg = "#${color.hex.crust}", bg = "#${color.hex.crust}" }
|
||||
local mantle = { fg = "#${color.hex.mantle}", bg = "#${color.hex.mantle}" }
|
||||
local text = { fg = "#${color.hex.text}", bg = "#${color.hex.crust}" }
|
||||
local accent = { fg = "#${color.hex.accent}", bg = "#${color.hex.accent}" }
|
||||
|
||||
@@ -1854,14 +1704,14 @@ in {
|
||||
line.sep(sep_start, accent, crust),
|
||||
tab.number(),
|
||||
tab.name(),
|
||||
line.sep(sep_end, crust, mantle),
|
||||
line.sep(sep_end, crust, base),
|
||||
hl = hl,
|
||||
margin = " ",
|
||||
}
|
||||
end),
|
||||
|
||||
-- Background
|
||||
hl = mantle,
|
||||
hl = bg,
|
||||
}
|
||||
end
|
||||
'';
|
||||
@@ -1869,7 +1719,7 @@ in {
|
||||
};
|
||||
|
||||
_plenary = {
|
||||
name = "plenary.nvim";
|
||||
name = "plenary";
|
||||
pkg = pkgs.vimPlugins.plenary-nvim;
|
||||
lazy = true;
|
||||
};
|
||||
@@ -1970,12 +1820,11 @@ in {
|
||||
shell = "fish";
|
||||
direction = "horizontal"; # 'vertical' | 'horizontal' | 'window' | 'float'
|
||||
auto_scroll = true;
|
||||
# clear_env = false;
|
||||
|
||||
float_opts = {
|
||||
border = "curved"; # 'single' | 'double' | 'shadow' | 'curved'
|
||||
width.__raw = "function() return math.floor(vim.o.columns * 0.95) end";
|
||||
height.__raw = "function() return math.floor(vim.o.lines * 0.85) end";
|
||||
width = 80;
|
||||
height = 80;
|
||||
winblend = 0;
|
||||
};
|
||||
};
|
||||
@@ -2148,40 +1997,18 @@ in {
|
||||
pkg = pkgs.vimPlugins.vimtex;
|
||||
init = ''
|
||||
function()
|
||||
vim.g.vimtex_mappings_enabled = true
|
||||
vim.g.vimtex_mappings_enabled = false
|
||||
vim.g.vimtex_view_method = "zathura"
|
||||
vim.g.vimtex_syntax_conceal_disable = false
|
||||
vim.g.vimtex_syntax_conceal = {
|
||||
accents = 1,
|
||||
ligatures = 1,
|
||||
cites = 1,
|
||||
fancy = 1,
|
||||
texTabularChar = 1,
|
||||
spacing = 1,
|
||||
greek = 1,
|
||||
math_bounds = 1,
|
||||
math_delimiters = 1,
|
||||
math_fracs = 1,
|
||||
math_super_sub = 1,
|
||||
math_symbols = 1,
|
||||
sections = 1,
|
||||
styles = 1,
|
||||
}
|
||||
|
||||
vim.g.vimtex_compiler_method = "latexmk"
|
||||
vim.g.vimtex_compiler_clean_paths = {"_minted*", "svg-inkscape*"}
|
||||
vim.g.vimtex_compiler_latexmk = {
|
||||
options = {
|
||||
"-verbose",
|
||||
"-shell-escape",
|
||||
"-file-line-error",
|
||||
"-synctex=1",
|
||||
"-interaction=nonstopmode",
|
||||
"-shell-escape",
|
||||
},
|
||||
aux_dir = ".aux",
|
||||
out_dir = ".out",
|
||||
}
|
||||
|
||||
end
|
||||
'';
|
||||
};
|
||||
@@ -2311,12 +2138,12 @@ in {
|
||||
};
|
||||
|
||||
yazi = rec {
|
||||
name = "yazi.nvim";
|
||||
name = "yazi";
|
||||
pkg = pkgs.vimPlugins.yazi-nvim;
|
||||
lazy = true;
|
||||
event = ["VeryLazy"];
|
||||
dependencies = [_plenary];
|
||||
config = mkDefaultConfigFor "yazi";
|
||||
config = mkDefaultConfig name;
|
||||
opts = {
|
||||
open_for_directories = true;
|
||||
highlight_hovered_buffers_in_same_directory = false;
|
||||
@@ -2378,7 +2205,6 @@ in {
|
||||
noice # Modern UI overhaul, e.g. floating cmdline
|
||||
# obsidian # Integration with Obsidian.md
|
||||
|
||||
opencode # TODO: Doesn't work, can't find "opencode --port" process
|
||||
# overseer # Run tasks from within neovim (e.g. cargo) # TODO:
|
||||
|
||||
persisted # Session management
|
||||
|
||||
@@ -60,27 +60,9 @@ end, {
|
||||
|
||||
-- Toggle Rmpc
|
||||
local Terminal = require("toggleterm.terminal").Terminal
|
||||
local rmpc = Terminal:new({
|
||||
cmd = "rmpc",
|
||||
hidden = true,
|
||||
close_on_exit = true,
|
||||
auto_scroll = false,
|
||||
direction = "float",
|
||||
})
|
||||
local rmpc =
|
||||
Terminal:new({ cmd = "rmpc", hidden = true, close_on_exit = true, auto_scroll = false, direction = "float" })
|
||||
|
||||
vim.g.toggle_rmpc = function()
|
||||
rmpc:toggle()
|
||||
end
|
||||
|
||||
-- Toggle FailNix UI
|
||||
local failnix = Terminal:new({
|
||||
cmd = "cd /home/christoph/Notes/TU/MastersThesis/FailNix && nix develop --command bash -c 'perl ./scripts/menu.pl'",
|
||||
hidden = true,
|
||||
close_on_exit = true,
|
||||
auto_scroll = false,
|
||||
direction = "float",
|
||||
})
|
||||
|
||||
vim.g.toggle_failnix = function()
|
||||
failnix:toggle()
|
||||
end
|
||||
|
||||
@@ -20,7 +20,7 @@ if g.neovide then
|
||||
|
||||
-- Neovide Fonts
|
||||
-- o.guifont = "JetBrainsMono Nerd Font Mono:h12:Medium"
|
||||
o.guifont = "MonoLisa Alt Script:h12:Medium"
|
||||
o.guifont = "MonoLisa Alt:h12:Medium"
|
||||
else
|
||||
-- require("notify").notify("Not running in NeoVide")
|
||||
end
|
||||
|
||||
@@ -340,12 +340,6 @@ _: let
|
||||
action = "<cmd>lua vim.g.toggle_rmpc()<cr>"; # Defined in extraConfigLua.lua
|
||||
options.desc = "Show Rmpc";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>.";
|
||||
action = "<cmd>lua vim.g.toggle_failnix()<cr>"; # Defined in extraConfigLua.lua
|
||||
options.desc = "Show FailNix";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>i";
|
||||
@@ -414,58 +408,6 @@ _: let
|
||||
}
|
||||
];
|
||||
|
||||
leader-opencode = [
|
||||
{
|
||||
mode = ["n" "v"];
|
||||
key = "<leader>o";
|
||||
action = "+opencode";
|
||||
}
|
||||
{
|
||||
mode = ["n" "v"];
|
||||
key = "<leader>oo";
|
||||
action.__raw = ''function() require("opencode").ask("@this: ") end'';
|
||||
options.desc = "Ask about @this";
|
||||
}
|
||||
{
|
||||
mode = ["n" "v"];
|
||||
key = "<leader>od";
|
||||
action.__raw = ''function() require("opencode").prompt("Explain @diagnostics") end'';
|
||||
options.desc = "Explain @diagnostics";
|
||||
}
|
||||
{
|
||||
mode = ["n" "v"];
|
||||
key = "<leader>oe";
|
||||
action.__raw = ''function() require("opencode").prompt("Explain @this and its context") end'';
|
||||
options.desc = "Explain @this";
|
||||
}
|
||||
{
|
||||
mode = ["n" "v"];
|
||||
key = "<leader>or";
|
||||
action.__raw = ''function() require("opencode").prompt("Review @this for correctness and readability") end'';
|
||||
options.desc = "Review @this";
|
||||
}
|
||||
{
|
||||
mode = ["n" "v"];
|
||||
key = "<leader>os";
|
||||
action.__raw = ''function() require("opencode").select() end'';
|
||||
options.desc = "Select Action";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>oa";
|
||||
action.__raw = ''function() return require("opencode").operator("@this ") .. "_" end'';
|
||||
options.desc = "Append Line to Prompt";
|
||||
options.expr = true;
|
||||
}
|
||||
{
|
||||
mode = "v";
|
||||
key = "<leader>oa";
|
||||
action.__raw = ''function() return require("opencode").operator("@this ") end'';
|
||||
options.desc = "Append Range to Prompt";
|
||||
options.expr = true;
|
||||
}
|
||||
];
|
||||
|
||||
leader-file = [
|
||||
{
|
||||
mode = "n";
|
||||
@@ -937,12 +879,6 @@ _: let
|
||||
action = "<cmd>Trouble diagnostics toggle focus=false win.position=bottom<cr>";
|
||||
options.desc = "Trouble Diagnostics";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>tT";
|
||||
action = "<cmd>ToggleTerm direction=float<cr>";
|
||||
options.desc = "Floating Terminal";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>tD";
|
||||
@@ -1062,7 +998,6 @@ in
|
||||
no-leader
|
||||
|
||||
leader
|
||||
leader-opencode
|
||||
leader-file
|
||||
leader-help
|
||||
leader-quit
|
||||
|
||||
@@ -1,18 +1,3 @@
|
||||
local ls = require("luasnip")
|
||||
local s = ls.snippet
|
||||
local sn = ls.snippet_node
|
||||
local isn = ls.indent_snippet_node
|
||||
local t = ls.text_node
|
||||
local i = ls.insert_node
|
||||
local f = ls.function_node
|
||||
local c = ls.choice_node
|
||||
local d = ls.dynamic_node
|
||||
local r = ls.restore_node
|
||||
local extras = require("luasnip.extras")
|
||||
local rep = extras.rep
|
||||
local fmt = require("luasnip.extras.fmt").fmt
|
||||
local fmta = require("luasnip.extras.fmt").fmta
|
||||
|
||||
return {
|
||||
-- The first list contains manually expanded snippts
|
||||
--
|
||||
@@ -33,7 +18,7 @@ return {
|
||||
|
||||
-- \begin{environment}
|
||||
s(
|
||||
{ trig = "beg", name = "begin/end", descr = "begin/end environment (generic)" },
|
||||
"beg",
|
||||
fmta(
|
||||
[[
|
||||
\begin{<>}
|
||||
@@ -43,28 +28,6 @@ return {
|
||||
{ i(1), i(0), rep(1) }
|
||||
)
|
||||
),
|
||||
s(
|
||||
{ trig = "item", name = "itemize", dscr = "bullet points (itemize)" },
|
||||
fmta(
|
||||
[[
|
||||
\begin{itemize}
|
||||
\item <>
|
||||
\end{itemize}
|
||||
]],
|
||||
{ i(0) }
|
||||
)
|
||||
),
|
||||
s(
|
||||
{ trig = "enum", name = "enumerate", dscr = "bullet points (enumerate)" },
|
||||
fmta(
|
||||
[[
|
||||
\begin{enumerate}
|
||||
\item <>
|
||||
\end{enumerate}
|
||||
]],
|
||||
{ i(0) }
|
||||
)
|
||||
),
|
||||
}, {
|
||||
-- The second list contains autosnippets
|
||||
}
|
||||
|
||||
+151
-632
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,6 @@ in {
|
||||
options.homemodules.packages = import ./options.nix {inherit lib mylib;};
|
||||
|
||||
config = lib.mkIf packages.enable {
|
||||
# TODO: Add extra packages option and use that from host-specific configs
|
||||
home.packages = with pkgs;
|
||||
lib.mkMerge [
|
||||
# Common packages
|
||||
@@ -43,9 +42,7 @@ in {
|
||||
# Nix
|
||||
nix-search-tv # Search nixpkgs, nur, nixos options and homemanager options
|
||||
nix-tree # Browse the nix store sorted by size (gdu for closures)
|
||||
|
||||
# TODO: Still broken on 2026-09-09
|
||||
# inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default # Search nixpkgs
|
||||
inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default # Search nixpkgs
|
||||
|
||||
# Video/Image/Audio utils
|
||||
ffmpeg-full # I love ffmpeg (including ffplay)
|
||||
@@ -77,17 +74,15 @@ in {
|
||||
# Common !headless packages
|
||||
(lib.optionals (!headless) [
|
||||
ripdrag # drag & drop from terminal
|
||||
# jellyfin-tui # Use module
|
||||
|
||||
inputs.masssprings.packages.${stdenv.hostPlatform.system}.default
|
||||
jellyfin-tui
|
||||
])
|
||||
|
||||
# Linux exclusive packages
|
||||
(lib.optionals (pkgs.stdenv.hostPlatform.isLinux) [
|
||||
(lib.optionals (pkgs.stdenv.isLinux) [
|
||||
pastel # Color tools
|
||||
nvd # Nix rebuild diff
|
||||
nurl # Generate nix fetcher sections based on URLs
|
||||
# python313 # Nicer scripting than bash
|
||||
python313 # Nicer scripting than bash
|
||||
lazyjournal # Journalctl viewer
|
||||
systemctl-tui
|
||||
restic # Backups
|
||||
@@ -97,11 +92,6 @@ in {
|
||||
jujutsu # git-like vcs
|
||||
lurk # strace analysis
|
||||
radare2
|
||||
disktui
|
||||
lldb
|
||||
inotify-tools
|
||||
xdotool
|
||||
gnome-keyring
|
||||
|
||||
# Hardware/Software info
|
||||
pciutils # lspci
|
||||
@@ -141,37 +131,35 @@ in {
|
||||
])
|
||||
|
||||
# Linux exclusive packages (!headless)
|
||||
(lib.optionals (pkgs.stdenv.hostPlatform.isLinux && (!headless)) [
|
||||
(lib.optionals (pkgs.stdenv.isLinux && (!headless)) [
|
||||
veracrypt
|
||||
wl-clipboard
|
||||
asciicam
|
||||
|
||||
# Proton
|
||||
proton-vpn
|
||||
protonmail-bridge-gui
|
||||
|
||||
# GUI stuff
|
||||
nautilus # Just in case
|
||||
signal-desktop
|
||||
anki
|
||||
font-manager # Previews fonts, but doesn't set them
|
||||
nextcloud-client
|
||||
keepassxc
|
||||
thunderbird # TODO: Email module
|
||||
obsidian
|
||||
zotero
|
||||
zeal # docs browser
|
||||
# helvum # unmaintained
|
||||
crosspipe
|
||||
vlc
|
||||
audacity
|
||||
# ferdium
|
||||
feishin # electron :(
|
||||
ferdium
|
||||
gparted
|
||||
# feishin # electron :(
|
||||
jellyfin-tui
|
||||
playerctl # Media player control
|
||||
czkawka-full # file deduplicator
|
||||
binaryninja-free # reverse engineering
|
||||
tableplus # database explorer
|
||||
# opencode-desktop
|
||||
lmstudio # TODO: Ollama
|
||||
claude-desktop
|
||||
opencode-desktop
|
||||
upscayl
|
||||
calibre
|
||||
|
||||
# Office
|
||||
kdePackages.wacomtablet # For xournalpp/krita
|
||||
@@ -180,24 +168,11 @@ in {
|
||||
hunspellDicts.en_US
|
||||
hunspellDicts.de_DE
|
||||
|
||||
# GTK-Apps because I hate nice software
|
||||
# gnome-calculator
|
||||
# gnome-calendar
|
||||
# helvum # unmaintained
|
||||
crosspipe
|
||||
# nautilus # This is the worst file manager I've ever used
|
||||
font-manager # Previews fonts, but doesn't set them
|
||||
gparted
|
||||
resources
|
||||
# celluloid
|
||||
# cine
|
||||
# eyedropper
|
||||
hyprpicker
|
||||
junction
|
||||
inputs.masssprings.packages.${stdenv.hostPlatform.system}.default
|
||||
])
|
||||
|
||||
# Darwin exclusive packages
|
||||
(lib.optionals pkgs.stdenv.hostPlatform.isDarwin [
|
||||
(lib.optionals pkgs.stdenv.isDarwin [
|
||||
# Use homebrew instead
|
||||
# alt-tab-macos
|
||||
# discord
|
||||
@@ -205,11 +180,6 @@ in {
|
||||
# nextcloud-client
|
||||
# proton-vpn
|
||||
# iina
|
||||
|
||||
# TODO: Update the docs module to be darwinix compatible
|
||||
# - The filepaths need to be adapted
|
||||
texliveFull
|
||||
typst
|
||||
])
|
||||
];
|
||||
|
||||
@@ -220,19 +190,9 @@ in {
|
||||
|
||||
direnv = {
|
||||
enable = true;
|
||||
enableFishIntegration = true;
|
||||
silent = true;
|
||||
nix-direnv.enable = true;
|
||||
};
|
||||
|
||||
# This replaces the normal direnv.enableFishIntegration.
|
||||
# direnv-instant = {
|
||||
# enable = true;
|
||||
# enableFishIntegration = true;
|
||||
# enableKittyIntegration = true;
|
||||
# settings.use_cache = true;
|
||||
# };
|
||||
|
||||
eza = {
|
||||
enable = true;
|
||||
enableFishIntegration = config.homemodules.fish.enable;
|
||||
|
||||
@@ -47,8 +47,6 @@ in {
|
||||
wrap_navigation: false,
|
||||
enable_mouse: true,
|
||||
enable_config_hot_reload: true,
|
||||
enable_lyrics_hot_reload: true,
|
||||
enable_lyrics_index: true,
|
||||
status_update_interval_ms: 1000,
|
||||
rewind_to_start_sec: 30,
|
||||
lyrics_dir: "${config.home.homeDirectory}/Music",
|
||||
@@ -90,37 +88,24 @@ in {
|
||||
(
|
||||
name: "Queue (1)",
|
||||
pane: Split(
|
||||
borders: "NONE",
|
||||
direction: Horizontal,
|
||||
panes: [
|
||||
// Left Column (Queue + Cava)
|
||||
(
|
||||
size: "70%",
|
||||
borders: "NONE",
|
||||
pane: Split(
|
||||
direction: Vertical,
|
||||
panes: [
|
||||
(
|
||||
size: "75%",
|
||||
borders: "ALL",
|
||||
border_symbols: Rounded,
|
||||
pane: Split(
|
||||
direction: Vertical,
|
||||
panes: [
|
||||
(
|
||||
size: "2",
|
||||
pane: Pane(QueueHeader()),
|
||||
),
|
||||
(
|
||||
size: "100%",
|
||||
pane: Pane(Queue),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
pane: Pane(Queue),
|
||||
),
|
||||
(
|
||||
size: "25%",
|
||||
borders: "ALL",
|
||||
border_symbols: Rounded,
|
||||
pane: Pane(Cava),
|
||||
)
|
||||
]
|
||||
@@ -130,19 +115,18 @@ in {
|
||||
// Right Column (AlbumArt + Lyrics)
|
||||
(
|
||||
size: "30%",
|
||||
borders: "NONE",
|
||||
pane: Split(
|
||||
direction: Vertical,
|
||||
panes: [
|
||||
(
|
||||
size: "75%",
|
||||
borders: "ALL",
|
||||
border_symbols: Rounded,
|
||||
pane: Pane(AlbumArt),
|
||||
),
|
||||
(
|
||||
size: "25%",
|
||||
borders: "ALL",
|
||||
border_symbols: Rounded,
|
||||
pane: Pane(Lyrics),
|
||||
),
|
||||
]
|
||||
@@ -153,59 +137,31 @@ in {
|
||||
),
|
||||
(
|
||||
name: "Albums (2)",
|
||||
pane: Split(
|
||||
size: "100%",
|
||||
direction: Vertical,
|
||||
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Albums))],
|
||||
)
|
||||
pane: Pane(Albums),
|
||||
),
|
||||
(
|
||||
name: "Album Artists (3)",
|
||||
pane: Split(
|
||||
size: "100%",
|
||||
direction: Vertical,
|
||||
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(AlbumArtists))],
|
||||
)
|
||||
pane: Pane(AlbumArtists),
|
||||
),
|
||||
(
|
||||
name: "Artists (4)",
|
||||
pane: Split(
|
||||
size: "100%",
|
||||
direction: Vertical,
|
||||
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Artists))],
|
||||
)
|
||||
pane: Pane(Artists),
|
||||
),
|
||||
(
|
||||
name: "Playlists (5)",
|
||||
pane: Split(
|
||||
size: "100%",
|
||||
direction: Vertical,
|
||||
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Playlists))],
|
||||
)
|
||||
pane: Pane(Playlists),
|
||||
),
|
||||
// (
|
||||
// name: "Directories (6)",
|
||||
// pane: Split(
|
||||
// size: "100%",
|
||||
// direction: Vertical,
|
||||
// panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Directories))],
|
||||
// )
|
||||
// pane: Pane(Directories),
|
||||
// ),
|
||||
(
|
||||
name: "Search (6)",
|
||||
pane: Split(
|
||||
size: "100%",
|
||||
direction: Vertical,
|
||||
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Search))],
|
||||
)
|
||||
pane: Pane(Search),
|
||||
),
|
||||
// (
|
||||
// name: "Visualizer (8)",
|
||||
// pane: Split(
|
||||
// size: "100%",
|
||||
// direction: Vertical,
|
||||
// panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Cava))],
|
||||
// )
|
||||
// pane: Pane(Cava),
|
||||
// ),
|
||||
],
|
||||
|
||||
@@ -331,6 +287,8 @@ in {
|
||||
#![enable(unwrap_variant_newtypes)]
|
||||
(
|
||||
default_album_art_path: None,
|
||||
show_song_table_header: true,
|
||||
draw_borders: true,
|
||||
format_tag_separator: " | ",
|
||||
browser_column_widths: [20, 38, 42],
|
||||
modal_backdrop: false,
|
||||
@@ -437,8 +395,6 @@ in {
|
||||
),
|
||||
(
|
||||
pane: Pane(Tabs),
|
||||
borders: "ALL",
|
||||
border_symbols: Rounded,
|
||||
size: "3",
|
||||
),
|
||||
(
|
||||
|
||||
@@ -15,44 +15,41 @@ in {
|
||||
enable = true;
|
||||
enableDefaultConfig = false;
|
||||
|
||||
settings = {
|
||||
matchBlocks = {
|
||||
"*" = {
|
||||
ForwardAgent = false;
|
||||
AddKeysToAgent =
|
||||
if pkgs.stdenv.hostPlatform.isLinux
|
||||
then "no"
|
||||
else "yes"; # Don't have keychain on darwin
|
||||
Compression = true;
|
||||
ServerAliveInterval = 0;
|
||||
ServerAliveCountMax = 3;
|
||||
HashKnownHosts = false;
|
||||
UserKnownHostsFile = "~/.ssh/known_hosts";
|
||||
ControlMaster = "no";
|
||||
ControlPath = "~/.ssh/master-%r@%n:%p";
|
||||
ControlPersist = "no";
|
||||
forwardAgent = false;
|
||||
addKeysToAgent = "no";
|
||||
compression = true;
|
||||
serverAliveInterval = 0;
|
||||
serverAliveCountMax = 3;
|
||||
hashKnownHosts = false;
|
||||
userKnownHostsFile = "~/.ssh/known_hosts";
|
||||
controlMaster = "no";
|
||||
controlPath = "~/.ssh/master-%r@%n:%p";
|
||||
controlPersist = "no";
|
||||
};
|
||||
"nixinator" = {
|
||||
Port = 5432;
|
||||
User = "christoph";
|
||||
HostName = "vps.chriphost.de";
|
||||
port = 5432;
|
||||
user = "christoph";
|
||||
hostname = "vps.chriphost.de";
|
||||
};
|
||||
"servenix" = {
|
||||
User = "christoph";
|
||||
HostName = "local.chriphost.de";
|
||||
user = "christoph";
|
||||
hostname = "local.chriphost.de";
|
||||
};
|
||||
"thinknix" = {
|
||||
User = "christoph";
|
||||
HostName = "think.chriphost.de";
|
||||
user = "christoph";
|
||||
hostname = "think.chriphost.de";
|
||||
};
|
||||
"vps" = {
|
||||
User = "root";
|
||||
HostName = "vps.chriphost.de";
|
||||
user = "root";
|
||||
hostname = "vps.chriphost.de";
|
||||
};
|
||||
"mars" = {
|
||||
User = "smchurla";
|
||||
HostName = "mars.cs.tu-dortmund.de";
|
||||
ServerAliveInterval = 60;
|
||||
LocalForward = [
|
||||
user = "smchurla";
|
||||
hostname = "mars.cs.tu-dortmund.de";
|
||||
serverAliveInterval = 60;
|
||||
localForwards = [
|
||||
{
|
||||
# Resultbrowser
|
||||
bind.port = 22941;
|
||||
|
||||
@@ -26,7 +26,6 @@ in {
|
||||
signCommits = true;
|
||||
};
|
||||
|
||||
jellyfin-tui.enable = true;
|
||||
kitty.enable = true;
|
||||
lazygit.enable = true;
|
||||
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
# TODO: Expose some settings
|
||||
{
|
||||
config,
|
||||
nixosConfig,
|
||||
lib,
|
||||
mylib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
with mylib.modules; let
|
||||
cfg = config.homemodules.vscode;
|
||||
in {
|
||||
options.homemodules.vscode = import ./options.nix {inherit lib mylib;};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
programs.vscode = {
|
||||
enable = true;
|
||||
package = pkgs.vscode;
|
||||
mutableExtensionsDir = false;
|
||||
|
||||
profiles.default = {
|
||||
enableUpdateCheck = false;
|
||||
enableExtensionUpdateCheck = false;
|
||||
enableMcpIntegration = true;
|
||||
|
||||
extensions = with pkgs.vscode-extensions; [
|
||||
# Theme
|
||||
catppuccin.catppuccin-vsc
|
||||
catppuccin.catppuccin-vsc-icons
|
||||
vscode-icons-team.vscode-icons
|
||||
|
||||
# General
|
||||
vscodevim.vim
|
||||
christian-kohler.path-intellisense
|
||||
ryu1kn.partial-diff
|
||||
redhat.vscode-yaml
|
||||
ms-vscode-remote.remote-ssh
|
||||
ms-vscode-remote.remote-ssh-edit
|
||||
ms-vscode.remote-explorer
|
||||
anthropic.claude-code
|
||||
|
||||
# Python
|
||||
ms-python.python
|
||||
ms-python.vscode-pylance
|
||||
ms-python.black-formatter
|
||||
|
||||
# C/C++
|
||||
ms-vscode.cpptools
|
||||
# llvm-vs-code-extensions.vscode-clangd
|
||||
ms-vscode.cmake-tools
|
||||
ms-vscode.makefile-tools
|
||||
# llvm-org.lldb-vscode
|
||||
vadimcn.vscode-lldb
|
||||
# "13xforever".language-x86-64-assembly
|
||||
|
||||
# Latex
|
||||
# james-yu.latex-workshop
|
||||
# valentjn.vscode-ltex
|
||||
];
|
||||
|
||||
keybindings = [];
|
||||
globalSnippets = {};
|
||||
languageSnippets = {};
|
||||
userMcp = {};
|
||||
|
||||
userSettings = {
|
||||
"editor.fontFamily" = config.homemodules.color.font;
|
||||
"editor.fontSize" = 14;
|
||||
"editor.smoothScrolling" = true;
|
||||
"editor.cursorSmoothCaretAnimation" = "on";
|
||||
"workbench.enableExperiments" = false;
|
||||
"workbench.list.smoothScrolling" = true;
|
||||
"workbench.colorTheme" = "Catppuccin Mocha";
|
||||
"workbench.iconTheme" = "catppuccin-mocha";
|
||||
"remote.SSH.configFile" = "~/.ssh/custom-config";
|
||||
"workbench.welcomePage.walkthroughs.openOnInstall" = false;
|
||||
"security.workspace.trust.enabled" = false;
|
||||
"chat.disableAIFeatures" = false;
|
||||
|
||||
# C++
|
||||
# "C_Cpp.intelliSenseEngine" = "disabled"; # IntelliSense conflics with Clangd
|
||||
};
|
||||
|
||||
userTasks = {};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -23,7 +23,7 @@ in {
|
||||
fixed-center = true;
|
||||
output = waybar.monitors;
|
||||
|
||||
modules-left = ["custom/launcher" "niri/workspaces" "niri/window" "hyprland/workspaces" "hyprland/window"]; # "user"
|
||||
modules-left = ["custom/launcher" "niri/workspaces" "niri/window"]; # "user"
|
||||
modules-center = ["mpris"]; # "systemd-failed-units"
|
||||
modules-right = ["privacy" "pulseaudio" "network" "disk" "cpu" "memory" "clock" "tray"];
|
||||
|
||||
@@ -58,27 +58,6 @@ in {
|
||||
icon-size = 22;
|
||||
};
|
||||
|
||||
"hyprland/workspaces" = {
|
||||
all-outputs = false;
|
||||
format = "{icon}";
|
||||
format-icons = {
|
||||
default = "";
|
||||
focused = "";
|
||||
active = "";
|
||||
};
|
||||
persistent-workspaces = {
|
||||
DP-1 = [1 2 3 4 5 6 7 8 9];
|
||||
DP-2 = [0];
|
||||
};
|
||||
};
|
||||
|
||||
"hyprland/window" = {
|
||||
format = "{title}";
|
||||
separate-outputs = false;
|
||||
icon = true;
|
||||
icon-size = 22;
|
||||
};
|
||||
|
||||
mpris = {
|
||||
format = "<span></span> {dynamic}";
|
||||
format-paused = "<span>{status_icon}</span> <i>{dynamic}</i>";
|
||||
@@ -200,7 +179,7 @@ in {
|
||||
border-width: ${border-width};
|
||||
border-radius: ${border-radius};
|
||||
border-color: #${color.hex.accent};
|
||||
background-color: rgba(${color.rgbS.mantle}, 0.7);
|
||||
background-color: rgba(${color.rgbS.mantle}, 1.0);
|
||||
}
|
||||
|
||||
tooltip {
|
||||
|
||||
@@ -17,19 +17,7 @@ in {
|
||||
shellWrapperName = "y";
|
||||
|
||||
plugins = {
|
||||
inherit
|
||||
(pkgs.yaziPlugins)
|
||||
chmod
|
||||
diff
|
||||
full-border
|
||||
git
|
||||
lazygit
|
||||
mount
|
||||
ouch
|
||||
rsync
|
||||
starship
|
||||
sudo
|
||||
; # smart-paste
|
||||
inherit (pkgs.yaziPlugins) chmod diff full-border git lazygit mount ouch rsync starship sudo; # smart-paste
|
||||
};
|
||||
|
||||
initLua = ''
|
||||
@@ -65,10 +53,9 @@ in {
|
||||
'';
|
||||
|
||||
# https://yazi-rs.github.io/docs/configuration/yazi
|
||||
# %sN: The N-th selected file (1...n)
|
||||
# %s: All selected files
|
||||
# %h: The hovered file (shell keybindings)
|
||||
# File placeholders are shell-escaped by Yazi; do not quote them.
|
||||
# "$n": The n-th selected file (1...n)
|
||||
# "$@": All selected files
|
||||
# "$0": The hovered file
|
||||
settings = {
|
||||
mgr = {
|
||||
show_hidden = false;
|
||||
@@ -81,43 +68,27 @@ in {
|
||||
opener = {
|
||||
play = [
|
||||
{
|
||||
run = ''mpv %s'';
|
||||
run = ''mpv "$@"'';
|
||||
orphan = true;
|
||||
desc = "Play selection with mpv";
|
||||
}
|
||||
{
|
||||
run = ''vlc %s'';
|
||||
orphan = true;
|
||||
desc = "Play selection with vlc";
|
||||
desc = "Play selection";
|
||||
}
|
||||
];
|
||||
edit = [
|
||||
{
|
||||
run = ''$EDITOR %s'';
|
||||
run = ''$EDITOR "$@"'';
|
||||
block = true;
|
||||
desc = "Edit selection";
|
||||
}
|
||||
];
|
||||
open = [
|
||||
{
|
||||
run = ''xdg-open %s1'';
|
||||
orphan = true;
|
||||
desc = "Open first selected file with xdg-open";
|
||||
}
|
||||
{
|
||||
run = ''imv %s'';
|
||||
orphan = true;
|
||||
desc = "Open selection with imv";
|
||||
}
|
||||
{
|
||||
run = ''junction %s'';
|
||||
orphan = true;
|
||||
desc = "Open selection with junction";
|
||||
run = ''xdg-open "$@"'';
|
||||
desc = "Open selection";
|
||||
}
|
||||
];
|
||||
extract = [
|
||||
{
|
||||
run = ''ouch decompress -y %s'';
|
||||
run = ''ouch decompress -y "$@"'';
|
||||
desc = "Extract selection";
|
||||
}
|
||||
];
|
||||
@@ -130,13 +101,13 @@ in {
|
||||
|
||||
plugin.prepend_fetchers = [
|
||||
{
|
||||
group = "git";
|
||||
url = "*";
|
||||
id = "git";
|
||||
name = "*";
|
||||
run = "git";
|
||||
}
|
||||
{
|
||||
group = "git";
|
||||
url = "*/";
|
||||
id = "git";
|
||||
name = "*/";
|
||||
run = "git";
|
||||
}
|
||||
];
|
||||
@@ -186,67 +157,43 @@ in {
|
||||
|
||||
mgr.prepend_keymap = [
|
||||
{
|
||||
on = [
|
||||
"<C-p>"
|
||||
"m"
|
||||
];
|
||||
on = ["<C-p>" "m"];
|
||||
run = "plugin mount";
|
||||
desc = "Manage device mounts";
|
||||
}
|
||||
{
|
||||
on = [
|
||||
"<C-p>"
|
||||
"c"
|
||||
];
|
||||
on = ["<C-p>" "c"];
|
||||
run = "plugin chmod";
|
||||
desc = "Chmod selection";
|
||||
}
|
||||
{
|
||||
on = [
|
||||
"<C-p>"
|
||||
"g"
|
||||
];
|
||||
on = ["<C-p>" "g"];
|
||||
run = "plugin lazygit";
|
||||
desc = "Run LazyGit";
|
||||
}
|
||||
{
|
||||
on = [
|
||||
"<C-p>"
|
||||
"a"
|
||||
];
|
||||
run = "plugin ouch 7z";
|
||||
on = ["<C-p>" "a"];
|
||||
run = "plugin ouch";
|
||||
desc = "Add selection to archive";
|
||||
}
|
||||
{
|
||||
on = [
|
||||
"<C-p>"
|
||||
"d"
|
||||
];
|
||||
run = ''shell --orphan -- ripdrag -a -n %s'';
|
||||
on = ["<C-p>" "d"];
|
||||
run = ''shell -- ripdrag -a -n "$@"'';
|
||||
desc = "Drag & drop selection";
|
||||
}
|
||||
{
|
||||
on = [
|
||||
"<C-p>"
|
||||
"D"
|
||||
];
|
||||
on = ["<C-p>" "D"];
|
||||
run = "plugin diff";
|
||||
desc = "Diff the selected with the hovered file";
|
||||
}
|
||||
{
|
||||
on = [
|
||||
"<C-p>"
|
||||
"r"
|
||||
];
|
||||
on = ["<C-p>" "r"];
|
||||
run = "plugin rsync";
|
||||
desc = "Copy files using rsync";
|
||||
}
|
||||
{
|
||||
on = [
|
||||
"<C-p>"
|
||||
"w"
|
||||
];
|
||||
run = ''shell -- wl-copy < %h'';
|
||||
on = ["<C-p>" "w"];
|
||||
run = ''wl-copy < "$0"'';
|
||||
desc = "Copy hovered file contents using wl-copy";
|
||||
}
|
||||
|
||||
@@ -257,10 +204,7 @@ in {
|
||||
}
|
||||
{
|
||||
on = "y";
|
||||
run = [
|
||||
''shell -- for path in %s; do echo "file://$path"; done | wl-copy -t text/uri-list''
|
||||
"yank"
|
||||
];
|
||||
run = [''shell -- for path in "$@"; do echo "file://$path"; done | wl-copy -t text/uri-list'' "yank"];
|
||||
desc = "Copy files to system clipboard on yank";
|
||||
}
|
||||
# {
|
||||
@@ -273,20 +217,13 @@ in {
|
||||
run = "remove --permanently";
|
||||
desc = "Delete selection";
|
||||
}
|
||||
{
|
||||
on = ["g" "m"];
|
||||
run = ''cd ~/Notes/TU/MastersThesis'';
|
||||
desc = "Go to MastersThesis";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
# https://github.com/catppuccin/yazi/blob/main/themes/mocha/catppuccin-mocha-lavender.toml
|
||||
theme = {
|
||||
mgr = {
|
||||
cwd = {
|
||||
fg = color.hexS.teal;
|
||||
};
|
||||
cwd = {fg = color.hexS.teal;};
|
||||
|
||||
hovered = {
|
||||
fg = color.hexS.accentText;
|
||||
@@ -343,9 +280,7 @@ in {
|
||||
};
|
||||
|
||||
border_symbol = "│";
|
||||
border_style = {
|
||||
fg = color.hexS.overlay0;
|
||||
};
|
||||
border_style = {fg = color.hexS.overlay0;};
|
||||
};
|
||||
|
||||
tabs = {
|
||||
@@ -414,104 +349,58 @@ in {
|
||||
bg = color.hexS.surface0;
|
||||
};
|
||||
|
||||
perm_type = {
|
||||
fg = color.hexS.blue;
|
||||
};
|
||||
perm_read = {
|
||||
fg = color.hexS.yellow;
|
||||
};
|
||||
perm_write = {
|
||||
fg = color.hexS.red;
|
||||
};
|
||||
perm_exec = {
|
||||
fg = color.hexS.green;
|
||||
};
|
||||
perm_sep = {
|
||||
fg = color.hexS.overlay0;
|
||||
};
|
||||
perm_type = {fg = color.hexS.blue;};
|
||||
perm_read = {fg = color.hexS.yellow;};
|
||||
perm_write = {fg = color.hexS.red;};
|
||||
perm_exec = {fg = color.hexS.green;};
|
||||
perm_sep = {fg = color.hexS.overlay0;};
|
||||
};
|
||||
|
||||
input = {
|
||||
border = {
|
||||
fg = color.hexS.accentDim;
|
||||
};
|
||||
border = {fg = color.hexS.accentDim;};
|
||||
title = {};
|
||||
value = {};
|
||||
selected = {
|
||||
reversed = true;
|
||||
};
|
||||
selected = {reversed = true;};
|
||||
};
|
||||
|
||||
pick = {
|
||||
border = {
|
||||
fg = color.hexS.accentDim;
|
||||
};
|
||||
active = {
|
||||
fg = color.hexS.accentHl;
|
||||
};
|
||||
border = {fg = color.hexS.accentDim;};
|
||||
active = {fg = color.hexS.accentHl;};
|
||||
inactive = {};
|
||||
};
|
||||
|
||||
confirm = {
|
||||
border = {
|
||||
fg = color.hexS.accentDim;
|
||||
};
|
||||
title = {
|
||||
fg = color.hexS.accentDim;
|
||||
};
|
||||
border = {fg = color.hexS.accentDim;};
|
||||
title = {fg = color.hexS.accentDim;};
|
||||
content = {};
|
||||
list = {};
|
||||
btn_yes = {
|
||||
reversed = true;
|
||||
};
|
||||
btn_yes = {reversed = true;};
|
||||
btn_no = {};
|
||||
};
|
||||
|
||||
cmp = {
|
||||
border = {
|
||||
fg = color.hexS.accentDim;
|
||||
};
|
||||
border = {fg = color.hexS.accentDim;};
|
||||
};
|
||||
|
||||
tasks = {
|
||||
border = {
|
||||
fg = color.hexS.accentDim;
|
||||
};
|
||||
border = {fg = color.hexS.accentDim;};
|
||||
title = {};
|
||||
hovered = {
|
||||
underline = true;
|
||||
};
|
||||
hovered = {underline = true;};
|
||||
};
|
||||
|
||||
which = {
|
||||
cand = {
|
||||
fg = color.hexS.accent;
|
||||
};
|
||||
desc = {
|
||||
fg = color.hexS.accentHl;
|
||||
};
|
||||
mask = {
|
||||
bg = color.hexS.surface0;
|
||||
};
|
||||
rest = {
|
||||
fg = color.hexS.surface0;
|
||||
};
|
||||
cand = {fg = color.hexS.accent;};
|
||||
desc = {fg = color.hexS.accentHl;};
|
||||
mask = {bg = color.hexS.surface0;};
|
||||
rest = {fg = color.hexS.surface0;};
|
||||
separator = " ";
|
||||
separator_style = {
|
||||
fg = color.hexS.text;
|
||||
};
|
||||
separator_style = {fg = color.hexS.text;};
|
||||
};
|
||||
|
||||
help = {
|
||||
on = {
|
||||
fg = color.hexS.accent;
|
||||
};
|
||||
run = {
|
||||
fg = color.hexS.accentHl;
|
||||
};
|
||||
desc = {
|
||||
fg = color.hexS.text;
|
||||
};
|
||||
on = {fg = color.hexS.accent;};
|
||||
run = {fg = color.hexS.accentHl;};
|
||||
desc = {fg = color.hexS.text;};
|
||||
hovered = {
|
||||
fg = color.hexS.accentText; # TODO: This is not applied
|
||||
|
||||
@@ -526,31 +415,19 @@ in {
|
||||
};
|
||||
|
||||
notify = {
|
||||
title_info = {
|
||||
fg = color.hexS.teal;
|
||||
};
|
||||
title_warn = {
|
||||
fg = color.hexS.yellow;
|
||||
};
|
||||
title_error = {
|
||||
fg = color.hexS.red;
|
||||
};
|
||||
title_info = {fg = color.hexS.teal;};
|
||||
title_warn = {fg = color.hexS.yellow;};
|
||||
title_error = {fg = color.hexS.red;};
|
||||
};
|
||||
|
||||
spot = {
|
||||
border = {
|
||||
fg = color.hexS.lavender;
|
||||
};
|
||||
title = {
|
||||
fg = color.hexS.lavender;
|
||||
};
|
||||
border = {fg = color.hexS.lavender;};
|
||||
title = {fg = color.hexS.lavender;};
|
||||
tbl_cell = {
|
||||
fg = color.hexS.lavender;
|
||||
reversed = true;
|
||||
};
|
||||
tbl_col = {
|
||||
bold = true;
|
||||
};
|
||||
tbl_col = {bold = true;};
|
||||
};
|
||||
|
||||
# Default rules good enough
|
||||
|
||||
@@ -1,199 +0,0 @@
|
||||
{
|
||||
config,
|
||||
nixosConfig,
|
||||
lib,
|
||||
mylib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
inherit (config.homemodules) zed color;
|
||||
in {
|
||||
options.homemodules.zed = import ./options.nix {inherit lib mylib;};
|
||||
|
||||
config = lib.mkIf zed.enable {
|
||||
programs.zed-editor = {
|
||||
enable = true;
|
||||
package = pkgs.zed-editor;
|
||||
enableMcpIntegration = true;
|
||||
mutableUserKeymaps = false;
|
||||
mutableUserSettings = false;
|
||||
mutableUserTasks = false;
|
||||
mutableUserDebug = false;
|
||||
|
||||
extensions = [
|
||||
"catppuccin"
|
||||
"catppuccin-icons"
|
||||
"comment"
|
||||
"git-firefly"
|
||||
|
||||
"nix"
|
||||
"perl"
|
||||
"fish"
|
||||
"lua"
|
||||
"toml"
|
||||
"csharp"
|
||||
"java"
|
||||
"latex"
|
||||
"typst"
|
||||
"haskell"
|
||||
"glsl"
|
||||
"mermaid"
|
||||
"clojure"
|
||||
"verilog"
|
||||
"qml"
|
||||
"plantuml"
|
||||
"graphviz"
|
||||
|
||||
"dockerfile"
|
||||
"docker-compose"
|
||||
|
||||
"html"
|
||||
"xml"
|
||||
"scss"
|
||||
"rainbow-csv"
|
||||
"sql"
|
||||
"svelte"
|
||||
"svelte-mcp"
|
||||
"jinja2"
|
||||
|
||||
"just"
|
||||
"make"
|
||||
"neocmake"
|
||||
"assembly"
|
||||
"wat"
|
||||
"linkerscript"
|
||||
"r"
|
||||
];
|
||||
|
||||
themes = {};
|
||||
userDebug = [];
|
||||
|
||||
# TODO: Add neovim keymaps
|
||||
userKeymaps = [
|
||||
{
|
||||
context = "Workspace";
|
||||
bindings = {
|
||||
"ctrl-/" = "terminal_panel::Toggle";
|
||||
};
|
||||
}
|
||||
{
|
||||
context = "Editor";
|
||||
unbind = {
|
||||
"ctrl-/" = [
|
||||
"editor::ToggleComments"
|
||||
{
|
||||
advance_downwards = false;
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
{
|
||||
context = "(vim_mode == normal || vim_mode == visual) && !menu";
|
||||
bindings = {
|
||||
"ctrl-c" = "editor::ToggleComments";
|
||||
};
|
||||
}
|
||||
];
|
||||
|
||||
userSettings = {
|
||||
buffer_font_family = config.homemodules.color.font;
|
||||
terminal.font_family = config.homemodules.color.font;
|
||||
theme = "Catppuccin Mocha";
|
||||
icon_theme = "Catppuccin Mocha";
|
||||
ui_font_size = 16;
|
||||
buffer_font_size = 14;
|
||||
|
||||
project_panel.dock = "left";
|
||||
outline_panel.dock = "left";
|
||||
collaboration_panel.dock = "left";
|
||||
git_panel = {
|
||||
dock = "left";
|
||||
tree_view = true;
|
||||
};
|
||||
|
||||
# TODO: Doesn't work, although perlnavigator advertises Perl::Tidy autoformatting...
|
||||
languages = {
|
||||
Perl = {
|
||||
formatter = "language_server";
|
||||
};
|
||||
};
|
||||
|
||||
auto_signature_help = true;
|
||||
lsp = {
|
||||
nil = {
|
||||
initialization_options = {
|
||||
formatting = {
|
||||
# command = null;
|
||||
command = ["${pkgs.alejandra}/bin/alejandra"];
|
||||
};
|
||||
};
|
||||
};
|
||||
nixd = {
|
||||
initialization_options = {
|
||||
formatting = {
|
||||
command = ["${pkgs.alejandra}/bin/alejandra"];
|
||||
};
|
||||
};
|
||||
};
|
||||
# No idea how to configure the formatter
|
||||
# perlnavigator-server = let
|
||||
# # TODO: Duplicated in neovim/default.nix. Need Perl module.
|
||||
# perl = pkgs.perl.withPackages (p:
|
||||
# with p; [
|
||||
# PLS
|
||||
# PerlCritic
|
||||
# PerlTidy
|
||||
# NetOpenSSH
|
||||
# DateTime
|
||||
# DBI
|
||||
# DBDMariaDB
|
||||
# CursesUI
|
||||
# TextCSV_XS
|
||||
# ]);
|
||||
# in {
|
||||
# initialization_options = {
|
||||
# "perlnavigator.perlPath" = "${perl}/bin";
|
||||
# "perlnavigator.includePaths" = ["${perl}/lib/perl5"];
|
||||
# };
|
||||
# };
|
||||
};
|
||||
|
||||
disable_ai = false;
|
||||
agent = {
|
||||
dock = "right";
|
||||
sidebar_side = "right";
|
||||
};
|
||||
agent_servers = {
|
||||
claude-acp = {
|
||||
type = "registry";
|
||||
};
|
||||
codex-acp = {
|
||||
type = "registry";
|
||||
};
|
||||
gemini = {
|
||||
type = "registry";
|
||||
};
|
||||
mistral-vibe = {
|
||||
type = "registry";
|
||||
};
|
||||
opencode = {
|
||||
type = "registry";
|
||||
};
|
||||
};
|
||||
|
||||
telemetry = {
|
||||
diagnostics = false;
|
||||
metrics = false;
|
||||
};
|
||||
|
||||
vim_mode = true;
|
||||
which_key = {
|
||||
enabled = true;
|
||||
delay_ms = 10;
|
||||
};
|
||||
};
|
||||
|
||||
userTasks = [];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
mylib,
|
||||
...
|
||||
}: {
|
||||
enable = lib.mkEnableOption "Enable zed editor";
|
||||
}
|
||||
+10
-34
@@ -9,42 +9,14 @@
|
||||
mkCommonNixSettings = username: {
|
||||
enable = true;
|
||||
package = pkgs.nixVersions.stable;
|
||||
|
||||
extraOptions = ''
|
||||
experimental-features = nix-command flakes pipe-operators
|
||||
'';
|
||||
|
||||
settings = rec {
|
||||
trusted-users = ["root" username];
|
||||
auto-optimise-store = true;
|
||||
|
||||
download-buffer-size = 524288000; # 500MB
|
||||
|
||||
substituters = [
|
||||
"https://cache.nixos.org"
|
||||
"https://nix-community.cachix.org"
|
||||
# "https://app.cachix.org/cache/nixos-rocm"
|
||||
"https://hyprland.cachix.org"
|
||||
"https://nix-gaming.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
|
||||
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||
# "nixos-rocm.cachix.org-1:VEpsf7pRIijjd8csKjFNBGzkBqOmw8H9PRmgAq14LnE="
|
||||
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
|
||||
"nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
|
||||
];
|
||||
};
|
||||
|
||||
gc = {
|
||||
automatic = false;
|
||||
options = "--delete-older-than 5d";
|
||||
};
|
||||
|
||||
optimise = {
|
||||
automatic = true;
|
||||
};
|
||||
|
||||
settings.trusted-users = ["root" username];
|
||||
gc.automatic = false;
|
||||
gc.options = "--delete-older-than 5d";
|
||||
settings.auto-optimise-store = true;
|
||||
optimise.automatic = true;
|
||||
registry = lib.mapAttrs' (n: v: lib.nameValuePair n {flake = v;}) inputs;
|
||||
nixPath = [
|
||||
"nixpkgs=${inputs.nixpkgs.outPath}"
|
||||
@@ -77,6 +49,7 @@
|
||||
|
||||
# Import the toplevel system configuration module.
|
||||
../system
|
||||
../system/cachix.nix
|
||||
|
||||
# Host specific configuration
|
||||
../system/${hostname}
|
||||
@@ -150,11 +123,14 @@
|
||||
# to allow installation of unfree software and my own overlays.
|
||||
{nixpkgs.pkgs = pkgs;}
|
||||
|
||||
# Import the toplevel system configuration module.
|
||||
../system/cachix.nix
|
||||
|
||||
# Host specific configuration
|
||||
../system/${hostname}
|
||||
|
||||
# Import all of my custom system modules
|
||||
../system/systemmodules/darwin.nix
|
||||
# ../system/systemmodules # TODO:
|
||||
]
|
||||
|
||||
extraModules
|
||||
|
||||
+56
-141
@@ -3,164 +3,79 @@
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
}: rec {
|
||||
# Receives attrs like:
|
||||
# {
|
||||
# "Poweroff" = "poweroff";
|
||||
# "Reload Hyprland" = "hyprctl reload";
|
||||
# }
|
||||
# mkSimpleMenu = let
|
||||
# # Makes a string like ''"Poweroff" "Reload Hyprland"''
|
||||
# unpack-options = attrs: "\"${lib.concatStringsSep "\" \"" (builtins.attrNames attrs)}\"";
|
||||
#
|
||||
# mkCase = option: action: "else if test \"${option}\" = $OPTION\n set ACTION \"${action}\"";
|
||||
#
|
||||
# cases = attrs:
|
||||
# attrs
|
||||
# |> builtins.mapAttrs mkCase
|
||||
# |> builtins.attrValues
|
||||
# |> builtins.concatStringsSep "\n";
|
||||
# in
|
||||
# {
|
||||
# prompt,
|
||||
# attrs,
|
||||
# command ? ''rofi -dmenu -i'',
|
||||
# }:
|
||||
# pkgs.writeScriptBin "rofi-menu-${prompt}" ''
|
||||
# #! ${pkgs.fish}/bin/fish
|
||||
#
|
||||
# # OPTIONS contains all possible values Rofi will display
|
||||
# set OPTIONS ${unpack-options attrs}
|
||||
#
|
||||
# # We choose a single OPTION using Rofi
|
||||
# set OPTION (echo -e (string join "\n" $OPTIONS) | ${command} -p "${prompt}")
|
||||
#
|
||||
# # Check if the chosen OPTION is a valid choice from OPTIONS
|
||||
# if not contains $OPTION $OPTIONS
|
||||
# exit
|
||||
# end
|
||||
#
|
||||
# # Set a command to execute based on the chosen OPTION
|
||||
# if false
|
||||
# exit # Easier to generate with this
|
||||
# ${cases attrs}
|
||||
# else
|
||||
# exit
|
||||
# end
|
||||
#
|
||||
# # Execute the command
|
||||
# eval $ACTION
|
||||
# '';
|
||||
mkSimpleMenu = let
|
||||
# Makes a string like ''"Poweroff" "Reload Hyprland"''
|
||||
unpack-options = attrs: "\"${lib.concatStringsSep "\" \"" (builtins.attrNames attrs)}\"";
|
||||
|
||||
# Rofi/Dmenu menu generator.
|
||||
#
|
||||
# Each element in `layers` is one of:
|
||||
# - attrset { "Label" = "value"; } # static options: selected value → $OPTIONn
|
||||
# - string "shell-cmd" # dynamic options from command: selected text → $OPTIONn
|
||||
# # may reference $OPTION0, $OPTION1, ... from earlier layers
|
||||
#
|
||||
# The "command" is the last action, it can reference $OPTION0, $OPTION1, ...
|
||||
# If no "command" is given and the last layer is a static attrset, its selected value is evaluated directly.
|
||||
#
|
||||
# The "prompts" list are optional per-layer prompt strings (falls back to "prompt" if not provided).
|
||||
#
|
||||
# vpn.fish equivalent:
|
||||
# mkMenu {
|
||||
# prompt = "vpn";
|
||||
# layers = [
|
||||
# "cat /etc/rofi-vpns"
|
||||
# { "start" = "start"; "stop" = "stop"; "status" = "status"; }
|
||||
# ];
|
||||
# command = "systemctl $OPTION1 $OPTION0.service";
|
||||
# }
|
||||
#
|
||||
# lectures.fish equivalent:
|
||||
# mkMenu {
|
||||
# prompt = "lecture";
|
||||
# layers = [
|
||||
# "eza -1 -D ~/Notes/TU"
|
||||
# "eza -1 ~/Notes/TU/$OPTION0/Lecture | grep '.pdf'"
|
||||
# ];
|
||||
# command = "xdg-open ~/Notes/TU/$OPTION0/Lecture/$OPTION1";
|
||||
# }
|
||||
mkMenu = {
|
||||
prompt,
|
||||
layers,
|
||||
prompts ? [],
|
||||
command ? null,
|
||||
rofiCmd ? "rofi -dmenu -i",
|
||||
}: let
|
||||
isStaticLayer = layer: builtins.isAttrs layer && !(layer ? options);
|
||||
isDynamicLayer = layer: builtins.isString layer;
|
||||
mkCase = option: action: "else if test \"${option}\" = $OPTION\n set ACTION \"${action}\"";
|
||||
|
||||
escStr = s: builtins.replaceStrings [''"'' "\\"] [''\"'' "\\\\"] s;
|
||||
cases = attrs:
|
||||
attrs
|
||||
|> builtins.mapAttrs mkCase
|
||||
|> builtins.attrValues
|
||||
|> builtins.concatStringsSep "\n";
|
||||
in
|
||||
{
|
||||
prompt,
|
||||
attrs,
|
||||
command ? ''rofi -dmenu -p " ${prompt} " -i'',
|
||||
}:
|
||||
pkgs.writeScriptBin "rofi-menu-${prompt}" ''
|
||||
#! ${pkgs.fish}/bin/fish
|
||||
|
||||
layerPrompt = i:
|
||||
if i < builtins.length prompts
|
||||
then lib.elemAt prompts i
|
||||
else prompt;
|
||||
# OPTIONS contains all possible values Rofi will display
|
||||
set OPTIONS ${unpack-options attrs}
|
||||
|
||||
# Static layer: attrset of label -> value
|
||||
# Displays labels in rofi; maps selected label to its value -> $OPTIONi
|
||||
mkStaticLayer = i: attrs: let
|
||||
lp = layerPrompt i;
|
||||
labels = builtins.attrNames attrs;
|
||||
optsStr = "\"${lib.concatStringsSep "\" \"" (map escStr labels)}\"";
|
||||
mkCase = label: value: "else if test \"${escStr label}\" = $_LABEL${toString i}\n set OPTION${toString i} \"${escStr value}\"";
|
||||
casesStr =
|
||||
builtins.concatStringsSep "\n"
|
||||
(builtins.attrValues (builtins.mapAttrs mkCase attrs));
|
||||
in {
|
||||
script = ''
|
||||
set _OPTS${toString i} ${optsStr}
|
||||
set _LABEL${toString i} (echo -e (string join "\n" $_OPTS${toString i}) | ${rofiCmd} -p "${lp}")
|
||||
if not contains $_LABEL${toString i} $_OPTS${toString i}
|
||||
# We choose a single OPTION using Rofi
|
||||
set OPTION (echo -e (string join "\n" $OPTIONS) | ${command})
|
||||
|
||||
# Check if the chosen OPTION is a valid choice from OPTIONS
|
||||
if not contains $OPTION $OPTIONS
|
||||
exit
|
||||
end
|
||||
|
||||
# Set a command to execute based on the chosen OPTION
|
||||
if false
|
||||
exit
|
||||
${casesStr}
|
||||
exit # Easier to generate with this
|
||||
${cases attrs}
|
||||
else
|
||||
exit
|
||||
end
|
||||
|
||||
# Execute the command
|
||||
eval $ACTION
|
||||
'';
|
||||
};
|
||||
|
||||
# Dynamic layer: shell command string whose output is piped to rofi
|
||||
# Selected text -> $OPTIONi; may reference earlier $OPTIONn variables
|
||||
mkDynamicLayer = i: cmd: let
|
||||
lp = layerPrompt i;
|
||||
in {
|
||||
script = ''
|
||||
set OPTION${toString i} (${cmd} | ${rofiCmd} -p "${lp}")
|
||||
if test -z $OPTION${toString i}
|
||||
exit
|
||||
end
|
||||
'';
|
||||
};
|
||||
# TODO: I want to generate the containers menu using the actionsA and actionsB attrs:
|
||||
# - actionsA will be generated from the stuff in oci-containers.containers
|
||||
# - actionsB will be set statically for start, stop, status
|
||||
|
||||
mkLayer = i: layer:
|
||||
if isStaticLayer layer
|
||||
then mkStaticLayer i layer
|
||||
else if isDynamicLayer layer
|
||||
then mkDynamicLayer i layer
|
||||
else throw "mkMenu: layer ${toString i} has invalid type";
|
||||
|
||||
layerResults = lib.imap0 mkLayer layers; # Map with 0-based index
|
||||
layerScripts = map (r: r.script) layerResults;
|
||||
lastLayer = lib.last layers;
|
||||
|
||||
finalCmd =
|
||||
if command != null
|
||||
then command
|
||||
else if isStaticLayer lastLayer
|
||||
then "$OPTION${toString (builtins.length layers - 1)}"
|
||||
else throw "mkMenu: 'command' must be set when the last layer is not a static attrset";
|
||||
# Receives attrs like:
|
||||
# {
|
||||
# optionA = "exa -1 -D ~/Notes/TU";
|
||||
# optionB = "exa -1 -D ~/Notes/TU/$OPTIONA/Lecture | grep \".pdf\"";
|
||||
# commandB = "xdg-open ~/Notes/TU/$OPTIONA/Lecture/$OPTIONB";
|
||||
# }
|
||||
#
|
||||
# Keys:
|
||||
# - optionA, optionB # Command that generates Rofi options:
|
||||
# exa -1 -D ~/Notes/TU
|
||||
# cat /etc/rofi-vpns
|
||||
# - commandA, commandB # Action to execute after sth. was chosen (mutually excl. with command)
|
||||
# - actionsA, actionsB # Configure actions by lookup (mutually excl. with command):
|
||||
# actionsB = {"status" = "systemctl status..."}
|
||||
# - colorA, colorB # Configure highlighting conditions:
|
||||
# colorA = {"red" = "systemctl ... | grep ..."};
|
||||
#
|
||||
# Use $OPTIONA and $OPTIONB to use the options chosen by option<A/B>-command and rofi
|
||||
# Use $EVALA and $EVALB to use the outputs generated by command<A/B>
|
||||
mkMenu = let
|
||||
in
|
||||
pkgs.writeScriptBin "rofi-menu-${prompt}" ''
|
||||
#! ${pkgs.fish}/bin/fish
|
||||
|
||||
${lib.concatStringsSep "\n" layerScripts}
|
||||
eval "${finalCmd}"
|
||||
'';
|
||||
prompt: attrs: "";
|
||||
}
|
||||
|
||||
+31
-37
@@ -29,36 +29,36 @@
|
||||
# Remove this after jetbrains.jdk builds again (nixpkgs issue 425328)
|
||||
# jetbrains.rider = pkgs-stable.jetbrains.rider;
|
||||
|
||||
# jetbrains =
|
||||
# prev.jetbrains
|
||||
# // {
|
||||
# clion = prev.jetbrains.clion.overrideAttrs (oldAttrs: rec {
|
||||
# version = "261.22158.47"; # March 6, 2026
|
||||
#
|
||||
# src = prev.fetchurl {
|
||||
# url = "https://download-cdn.jetbrains.com/cpp/CLion-${version}.tar.gz";
|
||||
#
|
||||
# # hash = "sha256-h6tnemVnV1YEsvIndwrq2sMsRZYuvTWMU5oqj/hkjdY="; # 261.21849.6
|
||||
# hash = "sha256-FUHNRioJvjwOWN+FkXEr3+NWR+QVxaZUOkJ0egQkcCQ="; # 261.22158.47
|
||||
# };
|
||||
#
|
||||
# # autoPatchelfIgnoreMissingDeps = [
|
||||
# # "libcrypto.so.1.1"
|
||||
# # "libssl.so.1.1"
|
||||
# # ];
|
||||
#
|
||||
# postFixup = ''
|
||||
# # Patch python3.12 shared libs that the upstream glob (python3.8) misses
|
||||
# find $out -path '*/python3.*/lib-dynload/*.so' -exec patchelf \
|
||||
# --replace-needed libssl.so.1.1 libssl.so \
|
||||
# --replace-needed libcrypto.so.1.1 libcrypto.so \
|
||||
# --replace-needed libcrypt.so.1 libcrypt.so \
|
||||
# {} +
|
||||
#
|
||||
# ${oldAttrs.postFixup or ""}
|
||||
# '';
|
||||
# });
|
||||
# };
|
||||
jetbrains =
|
||||
prev.jetbrains
|
||||
// {
|
||||
clion = prev.jetbrains.clion.overrideAttrs (oldAttrs: rec {
|
||||
version = "261.22158.47"; # March 6, 2026
|
||||
|
||||
src = prev.fetchurl {
|
||||
url = "https://download-cdn.jetbrains.com/cpp/CLion-${version}.tar.gz";
|
||||
|
||||
# hash = "sha256-h6tnemVnV1YEsvIndwrq2sMsRZYuvTWMU5oqj/hkjdY="; # 261.21849.6
|
||||
hash = "sha256-FUHNRioJvjwOWN+FkXEr3+NWR+QVxaZUOkJ0egQkcCQ="; # 261.22158.47
|
||||
};
|
||||
|
||||
# autoPatchelfIgnoreMissingDeps = [
|
||||
# "libcrypto.so.1.1"
|
||||
# "libssl.so.1.1"
|
||||
# ];
|
||||
|
||||
postFixup = ''
|
||||
# Patch python3.12 shared libs that the upstream glob (python3.8) misses
|
||||
find $out -path '*/python3.*/lib-dynload/*.so' -exec patchelf \
|
||||
--replace-needed libssl.so.1.1 libssl.so \
|
||||
--replace-needed libcrypto.so.1.1 libcrypto.so \
|
||||
--replace-needed libcrypt.so.1 libcrypt.so \
|
||||
{} +
|
||||
|
||||
${oldAttrs.postFixup or ""}
|
||||
'';
|
||||
});
|
||||
};
|
||||
|
||||
# Now in Nixpkgs
|
||||
# neovide = prev.neovide.overrideAttrs (finalAttrs: prevAttrs: {
|
||||
@@ -94,10 +94,4 @@
|
||||
};
|
||||
in
|
||||
# Composes a list of overlays and returns a single overlay function that combines them.
|
||||
nixpkgs.lib.composeManyExtensions [
|
||||
additions
|
||||
modifications
|
||||
|
||||
# This is already a complete overlay with final: prev:, so it must be composed directly
|
||||
(import ./latexminted.nix)
|
||||
]
|
||||
nixpkgs.lib.composeManyExtensions [additions modifications]
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
# Workaround for a broken `minted` in nixpkgs.
|
||||
#
|
||||
# The TeX Live snapshot in nixpkgs (2026-03-01) predates minted 3.8.0
|
||||
# (2026-03-04) and still ships 3.7.0 together with a bundled `latexminted`
|
||||
# 0.6.0 that does not run. Two independent replacements are needed:
|
||||
#
|
||||
# - the run container: minted.sty from the upstream 3.8.0 release, which
|
||||
# requires `latexminted` >= 0.7.0;
|
||||
# - the bin container: `pkgs.latexminted` (0.7.1), which works.
|
||||
#
|
||||
# The LaTeX package and the Python executable are versioned separately, hence
|
||||
# the two unrelated version numbers.
|
||||
#
|
||||
# Delete this file once nixpkgs ships minted >= 3.8.0.
|
||||
final: prev: let
|
||||
version = "3.8.0";
|
||||
|
||||
# Byte-identical to the CTAN 3.8.0 release, but pinned and already unpacked
|
||||
# (CTAN only ships minted.dtx, which would have to be run through docstrip).
|
||||
src = prev.fetchFromGitHub {
|
||||
owner = "gpoore";
|
||||
repo = "minted";
|
||||
rev = "631f7e8e93f37d4f6e7767ff45692d53e7c7360d"; # "[latex] minted v3.8.0"
|
||||
hash = "sha256-xUWScWRR62ikRxxz/YEauWLirvhsQPCcyE1O6cpWZRw=";
|
||||
};
|
||||
|
||||
minted = prev.texlive.pkgs.minted;
|
||||
|
||||
# texlive.withPackages reads pname/tlType/tlDeps/... off the containers, so
|
||||
# reuse the original metadata instead of reconstructing it.
|
||||
container = name: container: script:
|
||||
prev.runCommand "minted-${version}${name}" {
|
||||
inherit (container) meta;
|
||||
passthru =
|
||||
container.passthru
|
||||
// {
|
||||
inherit version;
|
||||
};
|
||||
}
|
||||
script;
|
||||
in {
|
||||
texlive =
|
||||
prev.texlive
|
||||
// {
|
||||
pkgs =
|
||||
prev.texlive.pkgs
|
||||
// {
|
||||
minted =
|
||||
minted
|
||||
// {
|
||||
tex = container "-tex" minted.tex ''
|
||||
install -Dm444 -t "$out"/tex/latex/minted \
|
||||
${src}/latex/minted/minted.sty \
|
||||
${src}/latex/minted/minted1.sty \
|
||||
${src}/latex/minted/minted2.sty
|
||||
'';
|
||||
|
||||
# A bare symlink is enough: texlive.withPackages resolves and wraps
|
||||
# everything under bin/ itself.
|
||||
out = container "" minted.out ''
|
||||
mkdir -p "$out"/bin
|
||||
ln -s ${prev.lib.getExe prev.latexminted} "$out"/bin/latexminted
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
# WARN: this file will get overwritten by $ cachix use <name>
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
folder = ./cachix;
|
||||
toImport = name: value: folder + ("/" + name);
|
||||
filterCaches = key: value: value == "regular" && lib.hasSuffix ".nix" key;
|
||||
imports =
|
||||
lib.mapAttrsToList toImport
|
||||
(lib.filterAttrs filterCaches (builtins.readDir folder));
|
||||
in {
|
||||
inherit imports;
|
||||
nix.settings.substituters = ["https://cache.nixos.org/"];
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
nix.settings = {
|
||||
substituters = [
|
||||
"https://nix-community.cachix.org"
|
||||
# "https://app.cachix.org/cache/nixos-rocm"
|
||||
# "https://ai.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||
# "nixos-rocm.cachix.org-1:VEpsf7pRIijjd8csKjFNBGzkBqOmw8H9PRmgAq14LnE="
|
||||
# "ai.cachix.org-1:N9dzRK+alWwoKXQlnn0H6aUx0lU/mspIoz8hMvGvbbc="
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -10,19 +10,6 @@
|
||||
hostname,
|
||||
...
|
||||
}: {
|
||||
systemmodules = {
|
||||
sops-nix.bootSecrets.${username} = [
|
||||
"user-password"
|
||||
];
|
||||
|
||||
sops-nix.secrets.${username} = [
|
||||
"ssh-private-key"
|
||||
"nix-github-token"
|
||||
"docker-password"
|
||||
"jellyfin-password"
|
||||
];
|
||||
};
|
||||
|
||||
nix = mylib.nixos.mkCommonNixSettings username;
|
||||
|
||||
networking = {
|
||||
@@ -88,13 +75,10 @@
|
||||
};
|
||||
|
||||
users.users.${username} = {
|
||||
name = "${username}";
|
||||
description = "Christoph";
|
||||
uid = 501;
|
||||
gid = 20;
|
||||
createHome = false;
|
||||
home = "/Users/${username}";
|
||||
isHidden = false;
|
||||
description = "Christoph";
|
||||
home = "/Users/${username}";
|
||||
createHome = false;
|
||||
|
||||
# NOTE: Not set if the user already exists on darwin, so use chsh for the root user
|
||||
shell = pkgs.fish;
|
||||
@@ -141,10 +125,6 @@
|
||||
upgrade = true;
|
||||
};
|
||||
|
||||
# taps = [
|
||||
# "homebrew-zathura/zathura"
|
||||
# ];
|
||||
|
||||
brews = [];
|
||||
|
||||
casks = [
|
||||
@@ -155,9 +135,6 @@
|
||||
"obsidian"
|
||||
"protonvpn"
|
||||
"signal"
|
||||
# "zathura"
|
||||
# "zathura-pdf-mupdf"
|
||||
"zotero"
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
+28
-32
@@ -91,7 +91,6 @@ with mylib.networking; {
|
||||
"ssh-private-key"
|
||||
"nix-github-token"
|
||||
"docker-password"
|
||||
"jellyfin-password"
|
||||
];
|
||||
};
|
||||
|
||||
@@ -144,7 +143,7 @@ with mylib.networking; {
|
||||
|
||||
documentation = {
|
||||
# NOTE: Disable this while configuring stuff, it's slow
|
||||
enable = false;
|
||||
enable = true;
|
||||
man.enable = config.documentation.enable;
|
||||
man.cache.enable = true; # Slow but needed for neovim man picker
|
||||
info.enable = config.documentation.enable;
|
||||
@@ -235,7 +234,6 @@ with mylib.networking; {
|
||||
description = "Christoph";
|
||||
group = "users";
|
||||
uid = 1000;
|
||||
home = "/home/${username}";
|
||||
extraGroups = [
|
||||
"networkmanager"
|
||||
"wheel"
|
||||
@@ -337,8 +335,7 @@ with mylib.networking; {
|
||||
|
||||
niri = {
|
||||
enable = !headless;
|
||||
package = pkgs.niri;
|
||||
# package = pkgs.niri-unstable; # TODO: Can remove this again once niri-flake is updated for 25.11
|
||||
package = pkgs.niri-unstable; # TODO: Can remove this again once niri-flake is updated for 25.11
|
||||
};
|
||||
|
||||
ssh.startAgent = true; # Use gnupg
|
||||
@@ -394,9 +391,9 @@ with mylib.networking; {
|
||||
};
|
||||
|
||||
# Trims the journal if too large
|
||||
journald.settings.Journal = {
|
||||
SystemMaxUse = "50M";
|
||||
};
|
||||
journald.extraConfig = ''
|
||||
SystemMaxUse=50M
|
||||
'';
|
||||
|
||||
acpid.enable = true;
|
||||
dbus.enable = true;
|
||||
@@ -418,30 +415,29 @@ with mylib.networking; {
|
||||
|
||||
systemd = {
|
||||
# TODO: Technically this should be a user service if it runs as ${username}?
|
||||
timers."refresh-nps-cache" = {
|
||||
wantedBy = ["timers.target"];
|
||||
timerConfig = {
|
||||
OnCalendar = "weekly"; # or however often you'd like
|
||||
Persistent = true;
|
||||
Unit = "refresh-nps-cache.service";
|
||||
};
|
||||
};
|
||||
|
||||
# timers."refresh-nps-cache" = {
|
||||
# wantedBy = ["timers.target"];
|
||||
# timerConfig = {
|
||||
# OnCalendar = "weekly"; # or however often you'd like
|
||||
# Persistent = true;
|
||||
# Unit = "refresh-nps-cache.service";
|
||||
# };
|
||||
# };
|
||||
|
||||
# services."refresh-nps-cache" = {
|
||||
# # Make sure `nix` and `nix-env` are findable by systemd.services.
|
||||
# path = ["/run/current-system/sw/"];
|
||||
# after = ["network.target"];
|
||||
# serviceConfig = {
|
||||
# Type = "oneshot";
|
||||
# User = "${username}";
|
||||
# };
|
||||
# script = ''
|
||||
# set -eu
|
||||
# echo "Start refreshing nps cache..."
|
||||
# ${inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default}/bin/nps -dddd -e -r
|
||||
# echo "... finished nps cache with exit code $?."
|
||||
# '';
|
||||
# };
|
||||
services."refresh-nps-cache" = {
|
||||
# Make sure `nix` and `nix-env` are findable by systemd.services.
|
||||
path = ["/run/current-system/sw/"];
|
||||
after = ["network.target"];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
User = "${username}";
|
||||
};
|
||||
script = ''
|
||||
set -eu
|
||||
echo "Start refreshing nps cache..."
|
||||
${inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default}/bin/nps -dddd -e -r
|
||||
echo "... finished nps cache with exit code $?."
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
./disks.nix
|
||||
|
||||
# General services
|
||||
../services/comfyui.nix
|
||||
../services/fileflows-node.nix
|
||||
];
|
||||
|
||||
@@ -123,6 +124,7 @@
|
||||
# 31431 # Parsec
|
||||
5173 # SvelteKit
|
||||
8090 # PocketBase
|
||||
8188 # ComfyUI
|
||||
];
|
||||
|
||||
allowedUDPPorts = [
|
||||
@@ -133,14 +135,13 @@
|
||||
# 31431 # Parsec
|
||||
5173 # SvelteKit
|
||||
8090 # PocketBase
|
||||
8188 # ComfyUI
|
||||
];
|
||||
};
|
||||
|
||||
sops-nix.secrets.${username} = [
|
||||
"makemkv-app-key"
|
||||
"restic-repo-key"
|
||||
"context7-api-key"
|
||||
"obsidian-rest-api-key"
|
||||
];
|
||||
};
|
||||
|
||||
@@ -192,53 +193,7 @@
|
||||
# };
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
spice
|
||||
spice-gtk
|
||||
];
|
||||
|
||||
stylix = {
|
||||
enable = true;
|
||||
autoEnable = false;
|
||||
base16Scheme = "${pkgs.base16-schemes}/share/themes/catppuccin-mocha.yaml";
|
||||
|
||||
# TODO: Duplicated from fonts module (set this inside fonts module?)
|
||||
fonts = {
|
||||
serif = {
|
||||
package = pkgs.noto-fonts-cjk-serif;
|
||||
name = "Noto Serif CJK SC";
|
||||
};
|
||||
sansSerif = {
|
||||
package = pkgs.noto-fonts-cjk-sans;
|
||||
name = "Noto Sans CJK SC";
|
||||
};
|
||||
monospace = {
|
||||
package = pkgs.monolisa;
|
||||
name = "MonoLisa Alt Script";
|
||||
};
|
||||
emoji = {
|
||||
package = pkgs.noto-fonts-color-emoji;
|
||||
name = "Noto Color Emoji";
|
||||
};
|
||||
};
|
||||
|
||||
targets = {};
|
||||
};
|
||||
|
||||
virtualisation = {
|
||||
libvirtd = {
|
||||
enable = true;
|
||||
qemu = {
|
||||
package = pkgs.qemu_kvm;
|
||||
# ovmf.enable = true; # deprecated
|
||||
swtpm.enable = true;
|
||||
runAsRoot = true;
|
||||
};
|
||||
};
|
||||
spiceUSBRedirection.enable = true;
|
||||
};
|
||||
|
||||
networking.firewall.trustedInterfaces = ["virbr0"]; # libvirt
|
||||
# environment.systemPackages = with pkgs; [];
|
||||
|
||||
programs = {
|
||||
ausweisapp = {
|
||||
@@ -246,77 +201,89 @@
|
||||
openFirewall = true; # Directly set port in firewall
|
||||
};
|
||||
|
||||
# TODO: Doesn't work with steam flatpak
|
||||
# gamescope = {
|
||||
# enable = true;
|
||||
# enableWsi = true;
|
||||
# };
|
||||
|
||||
ghidra = {
|
||||
enable = true;
|
||||
gdb = true;
|
||||
};
|
||||
|
||||
steam.platformOptimizations.enable = true; # From nix-gaming module
|
||||
virt-manager.enable = true;
|
||||
};
|
||||
|
||||
services = {
|
||||
# desktopManager.plasma6.enable = true;
|
||||
# displayManager.gdm.enable = true; # Somehow, Plasma's own manager didn't work
|
||||
|
||||
btrfs.autoScrub = {
|
||||
enable = true;
|
||||
interval = "weekly";
|
||||
fileSystems = ["/"];
|
||||
};
|
||||
|
||||
# Temporarily ban IPs for SSH after failed login attempts
|
||||
fail2ban = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
greetd = {
|
||||
enable = false;
|
||||
restart = false;
|
||||
useTextGreeter = true;
|
||||
|
||||
settings = {
|
||||
terminal.vt = 1;
|
||||
|
||||
default_session = {
|
||||
# command = "${pkgs.tuigreet}/bin/tuigreet --time --cmd $SHELL";
|
||||
command = "${pkgs.tuigreet}/bin/tuigreet --time --cmd niri-session";
|
||||
user = "greeter";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
kmscon = {
|
||||
enable = false;
|
||||
hwRender = true;
|
||||
useXkbConfig = true;
|
||||
# autologinUser = username;
|
||||
|
||||
config = let
|
||||
color = config.home-manager.users.${username}.homemodules.color;
|
||||
in {
|
||||
# term=xterm-256color
|
||||
|
||||
hwaccel = true;
|
||||
|
||||
font-name = color.font;
|
||||
font-size = 14;
|
||||
|
||||
mode = "3440x1440";
|
||||
palette = "custom";
|
||||
|
||||
palette-black = "0,0,0";
|
||||
pallette-white = "255,255,255";
|
||||
|
||||
palette-red = color.rgbS.red;
|
||||
palette-light-red = color.rgbS.red;
|
||||
|
||||
palette-green = color.rgbS.green;
|
||||
palette-light-green = color.rgbS.green;
|
||||
|
||||
palette-yellow = color.rgbS.yellow;
|
||||
palette-light-yellow = color.rgbS.yellow;
|
||||
|
||||
palette-blue = color.rgbS.blue;
|
||||
palette-light-blue = color.rgbS.blue;
|
||||
|
||||
palette-magenta = color.rgbS.pink;
|
||||
palette-light-magenta = color.rgbS.pink;
|
||||
|
||||
palette-cyan = color.rgbS.teal;
|
||||
palette-light-cyan = color.rgbS.teal;
|
||||
|
||||
palette-foreground = color.rgbS.text;
|
||||
palette-background = "0,0,0";
|
||||
};
|
||||
fonts = [
|
||||
{
|
||||
name = "MonoLisa Alt Script";
|
||||
package = pkgs.monolisa;
|
||||
}
|
||||
];
|
||||
|
||||
# NOTE: Do NOT use multline strings here!
|
||||
# This will create a linebreak in the systemd service and break login!
|
||||
extraOptions = "";
|
||||
|
||||
extraConfig = let
|
||||
color = config.home-manager.users.${username}.homemodules.color;
|
||||
in ''
|
||||
# term=xterm-256color
|
||||
font-size=14
|
||||
mode=3440x1440
|
||||
palette=custom
|
||||
|
||||
palette-black=0,0,0
|
||||
pallette-white=255,255,255
|
||||
|
||||
palette-red=${color.rgbS.red}
|
||||
palette-light-red=${color.rgbS.red}
|
||||
|
||||
palette-green=${color.rgbS.green}
|
||||
palette-light-green=${color.rgbS.green}
|
||||
|
||||
palette-yellow=${color.rgbS.yellow}
|
||||
palette-light-yellow=${color.rgbS.yellow}
|
||||
|
||||
palette-blue=${color.rgbS.blue}
|
||||
palette-light-blue=${color.rgbS.blue}
|
||||
|
||||
palette-magenta=${color.rgbS.pink}
|
||||
palette-light-magenta=${color.rgbS.pink}
|
||||
|
||||
palette-cyan=${color.rgbS.teal}
|
||||
palette-light-cyan=${color.rgbS.teal}
|
||||
|
||||
palette-foreground=${color.rgbS.text}
|
||||
palette-background=0,0,0
|
||||
'';
|
||||
};
|
||||
|
||||
openssh = {
|
||||
|
||||
+95
-96
@@ -82,8 +82,7 @@
|
||||
};
|
||||
"swap" = {
|
||||
mountpoint = "/swap";
|
||||
# Configured in hardware-configuration.nix
|
||||
# swap.swapfile.size = "64G";
|
||||
swap.swapfile.size = "16G";
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -93,101 +92,101 @@
|
||||
};
|
||||
};
|
||||
|
||||
# games = {
|
||||
# type = "disk";
|
||||
# device = "/dev/disk/by-id/nvme-WD_BLACK_SN850X_2000GB_231623802252";
|
||||
# content = {
|
||||
# type = "gpt";
|
||||
# partitions = {
|
||||
# luks = {
|
||||
# label = "LUKS_GAMES";
|
||||
# size = "100%";
|
||||
# content = {
|
||||
# type = "luks";
|
||||
# name = "crypted_games";
|
||||
#
|
||||
# extraOpenArgs = [
|
||||
# "--perf-no_read_workqueue"
|
||||
# "--perf-no_write_workqueue"
|
||||
# ];
|
||||
#
|
||||
# settings = {
|
||||
# allowDiscards = true;
|
||||
# crypttabExtraOpts = ["fido2-device=auto" "token-timeout=10" "tries=5"];
|
||||
#
|
||||
# # Disable for interactive password entry
|
||||
# # This is contained on the main disk, so by unlocking the main disk with the password,
|
||||
# # the second disk can unlock automatically
|
||||
# keyFile = "/persist/home/christoph/.secrets/luks.keyfile";
|
||||
# fallbackToPassword = false;
|
||||
# };
|
||||
#
|
||||
# content = {
|
||||
# type = "btrfs";
|
||||
# extraArgs = ["-L" "GAMES" "-f"];
|
||||
# subvolumes = {
|
||||
# "data" = {
|
||||
# mountpoint = "/home/christoph/Games";
|
||||
# mountOptions = [
|
||||
# "compress=zstd"
|
||||
# "noatime"
|
||||
# ];
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
games = {
|
||||
type = "disk";
|
||||
device = "/dev/disk/by-id/nvme-WD_BLACK_SN850X_2000GB_231623802252";
|
||||
content = {
|
||||
type = "gpt";
|
||||
partitions = {
|
||||
luks = {
|
||||
label = "LUKS_GAMES";
|
||||
size = "100%";
|
||||
content = {
|
||||
type = "luks";
|
||||
name = "crypted_games";
|
||||
|
||||
# ssd = {
|
||||
# type = "disk";
|
||||
# device = "/dev/disk/by-id/nvme-eui.00253857019ebd67";
|
||||
# content = {
|
||||
# type = "gpt";
|
||||
# partitions = {
|
||||
# luks = {
|
||||
# label = "LUKS_SSD";
|
||||
# size = "100%";
|
||||
# content = {
|
||||
# type = "luks";
|
||||
# name = "crypted_ssd";
|
||||
#
|
||||
# extraOpenArgs = [
|
||||
# "--perf-no_read_workqueue"
|
||||
# "--perf-no_write_workqueue"
|
||||
# ];
|
||||
#
|
||||
# settings = {
|
||||
# allowDiscards = true;
|
||||
# crypttabExtraOpts = ["fido2-device=auto" "token-timeout=10" "tries=5"];
|
||||
#
|
||||
# # Disable for interactive password entry
|
||||
# # This is contained on the main disk, so by unlocking the main disk with the password,
|
||||
# # the second disk can unlock automatically
|
||||
# keyFile = "/persist/home/christoph/.secrets/luks.keyfile";
|
||||
# fallbackToPassword = false;
|
||||
# };
|
||||
#
|
||||
# content = {
|
||||
# type = "btrfs";
|
||||
# extraArgs = ["-L" "SSD" "-f"];
|
||||
# subvolumes = {
|
||||
# "data" = {
|
||||
# mountpoint = "/home/christoph/SSD";
|
||||
# mountOptions = [
|
||||
# "compress=zstd"
|
||||
# "noatime"
|
||||
# ];
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
extraOpenArgs = [
|
||||
"--perf-no_read_workqueue"
|
||||
"--perf-no_write_workqueue"
|
||||
];
|
||||
|
||||
settings = {
|
||||
allowDiscards = true;
|
||||
crypttabExtraOpts = ["fido2-device=auto" "token-timeout=10" "tries=5"];
|
||||
|
||||
# Disable for interactive password entry
|
||||
# This is contained on the main disk, so by unlocking the main disk with the password,
|
||||
# the second disk can unlock automatically
|
||||
keyFile = "/persist/home/christoph/.secrets/luks.keyfile";
|
||||
fallbackToPassword = false;
|
||||
};
|
||||
|
||||
content = {
|
||||
type = "btrfs";
|
||||
extraArgs = ["-L" "GAMES" "-f"];
|
||||
subvolumes = {
|
||||
"data" = {
|
||||
mountpoint = "/home/christoph/Games";
|
||||
mountOptions = [
|
||||
"compress=zstd"
|
||||
"noatime"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ssd = {
|
||||
type = "disk";
|
||||
device = "/dev/disk/by-id/nvme-eui.00253857019ebd67";
|
||||
content = {
|
||||
type = "gpt";
|
||||
partitions = {
|
||||
luks = {
|
||||
label = "LUKS_SSD";
|
||||
size = "100%";
|
||||
content = {
|
||||
type = "luks";
|
||||
name = "crypted_ssd";
|
||||
|
||||
extraOpenArgs = [
|
||||
"--perf-no_read_workqueue"
|
||||
"--perf-no_write_workqueue"
|
||||
];
|
||||
|
||||
settings = {
|
||||
allowDiscards = true;
|
||||
crypttabExtraOpts = ["fido2-device=auto" "token-timeout=10" "tries=5"];
|
||||
|
||||
# Disable for interactive password entry
|
||||
# This is contained on the main disk, so by unlocking the main disk with the password,
|
||||
# the second disk can unlock automatically
|
||||
keyFile = "/persist/home/christoph/.secrets/luks.keyfile";
|
||||
fallbackToPassword = false;
|
||||
};
|
||||
|
||||
content = {
|
||||
type = "btrfs";
|
||||
extraArgs = ["-L" "SSD" "-f"];
|
||||
subvolumes = {
|
||||
"data" = {
|
||||
mountpoint = "/home/christoph/SSD";
|
||||
mountOptions = [
|
||||
"compress=zstd"
|
||||
"noatime"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -121,13 +121,18 @@
|
||||
fsType = "nfs";
|
||||
options = ["defaults" "rw" "noatime" "_netdev" "bg" "hard"];
|
||||
};
|
||||
|
||||
"/media/Box" = {
|
||||
device = "192.168.86.20:/mnt/Seagate4TB/Box";
|
||||
fsType = "nfs";
|
||||
options = ["defaults" "rw" "relatime" "_netdev" "bg" "hard"];
|
||||
};
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{
|
||||
device = "/swap/swapfile";
|
||||
size = 1024 * 64; # Without hibernation 4.0 GB to 0.5 x RAM
|
||||
randomEncryption.enable = false; # The disk is already encrypted. Useless and might lead to system freeze.
|
||||
device = "/var/swap";
|
||||
size = 1024 * 16; # Without hibernation 4.0 GB to 0.5 x RAM
|
||||
}
|
||||
];
|
||||
|
||||
@@ -160,9 +165,6 @@
|
||||
|
||||
# https://discourse.nixos.org/t/nvidia-open-breaks-hardware-acceleration/58770/3
|
||||
nvidia-vaapi-driver # Experimental, doesn't work with chromium
|
||||
|
||||
# Hdr in games with DXVK_HDR=1 ENABLE_HDR_WSI=1
|
||||
vulkan-hdr-layer-kwin6
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
@@ -19,12 +19,12 @@
|
||||
../services/formula10.nix
|
||||
../services/formula11.nix
|
||||
../services/formula12.nix
|
||||
# ../services/statespaces.nix
|
||||
../services/statespaces.nix
|
||||
|
||||
# General services
|
||||
../services/arcane-agent.nix
|
||||
../services/authelia.nix
|
||||
../services/bazarr.nix
|
||||
../services/box.nix
|
||||
../services/fileflows.nix
|
||||
../services/gitea.nix
|
||||
../services/immich.nix
|
||||
@@ -32,12 +32,11 @@
|
||||
../services/kiwix.nix
|
||||
../services/kopia.nix
|
||||
../services/nextcloud.nix
|
||||
../services/ntfy.nix
|
||||
../services/nginx-proxy-manager.nix
|
||||
../services/paperless.nix
|
||||
# ../services/plex.nix # Their monetization strategy is absolutely atrocious
|
||||
# ../services/portainer-agent.nix
|
||||
# ../services/pulse-agent-servenix.nix
|
||||
../services/portainer-agent.nix
|
||||
../services/pulse-agent-servenix.nix
|
||||
../services/prowlarr.nix
|
||||
../services/radarr.nix
|
||||
../services/sabnzbd-movies.nix
|
||||
@@ -45,7 +44,7 @@
|
||||
../services/sonarr.nix
|
||||
../services/teamspeak.nix
|
||||
../services/tinymediamanager.nix
|
||||
# ../services/whats-up-docker.nix
|
||||
../services/whats-up-docker.nix
|
||||
];
|
||||
|
||||
systemmodules = {
|
||||
@@ -85,7 +84,6 @@
|
||||
443 # HTTPS (Nginx Proxy Manager)
|
||||
|
||||
3000 # Gitea (runner needs to reach local gitea instance)
|
||||
3553 # Arcane
|
||||
|
||||
30033 # Teamspeak
|
||||
10080 # Teamspeak
|
||||
@@ -98,7 +96,6 @@
|
||||
443 # HTTPS (Nginx Proxy Manager)
|
||||
|
||||
3000 # Gitea (runner needs to reach local gitea instance)
|
||||
3553 # Arcane
|
||||
|
||||
5520 # HyTale
|
||||
|
||||
@@ -113,9 +110,6 @@
|
||||
"kopia-server-password"
|
||||
"kopia-user-password"
|
||||
"paperless-nextcloud-sync-password"
|
||||
"ntfy-auth-users"
|
||||
"ntfy-auth-tokens"
|
||||
"arcane-agent-key"
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
@@ -69,6 +69,12 @@
|
||||
fsType = "nfs";
|
||||
options = ["defaults" "rw" "relatime" "_netdev" "bg" "hard"];
|
||||
};
|
||||
|
||||
"/media/Box" = {
|
||||
device = "192.168.86.20:/mnt/Seagate4TB/Box";
|
||||
fsType = "nfs";
|
||||
options = ["defaults" "rw" "relatime" "_netdev" "bg" "hard"];
|
||||
};
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
@@ -86,7 +92,7 @@
|
||||
nvidia-container-toolkit.enable = true;
|
||||
|
||||
nvidia = {
|
||||
package = config.boot.kernelPackages.nvidiaPackages.legacy_580;
|
||||
package = config.boot.kernelPackages.nvidiaPackages.stable;
|
||||
|
||||
modesetting.enable = false;
|
||||
open = false; # GTX 1070 is too old for open drivers
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
{
|
||||
mylib,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
arcaneVersion = "v2.3.0";
|
||||
in {
|
||||
# If we need to pass secrets to containers we can't use plain env variables.
|
||||
sops.templates."arcane-agent_secrets.env".content = ''
|
||||
AGENT_TOKEN=${config.sops.placeholder.arcane-agent-key}
|
||||
'';
|
||||
|
||||
virtualisation.oci-containers.containers = {
|
||||
arcane-agent = {
|
||||
image = "ghcr.io/getarcaneapp/arcane-headless:${arcaneVersion}";
|
||||
autoStart = true;
|
||||
|
||||
login = mylib.containers.mkDockerLogin config;
|
||||
|
||||
dependsOn = [];
|
||||
|
||||
ports = [
|
||||
"3553:3553"
|
||||
];
|
||||
|
||||
volumes = [
|
||||
"/var/run/docker.sock:/var/run/docker.sock"
|
||||
|
||||
"arcane-agent_data:/app/data"
|
||||
"/media/synology-syncthing:/backups"
|
||||
];
|
||||
|
||||
environment = {
|
||||
MANAGER_API_URL = "https://arcane.think.chriphost.de";
|
||||
AGENT_MODE = "true";
|
||||
EDGE_TRANSPORT = "poll";
|
||||
|
||||
PUID = "1000";
|
||||
PGID = "1000";
|
||||
TZ = "Europe/Berlin";
|
||||
};
|
||||
|
||||
environmentFiles = [
|
||||
config.sops.templates."arcane-agent_secrets.env".path
|
||||
];
|
||||
|
||||
extraOptions = [
|
||||
# "--privileged"
|
||||
# "--device=nvidia.com/gpu=all"
|
||||
"--net=behind-nginx"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
mylib,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
arcaneVersion = "v2.3.0";
|
||||
in {
|
||||
# If we need to pass secrets to containers we can't use plain env variables.
|
||||
sops.templates."arcane_secrets.env".content = ''
|
||||
ENCRYPTION_KEY=${config.sops.placeholder.arcane-encryption-key}
|
||||
JWT_SECRET=${config.sops.placeholder.arcane-jwt-secret}
|
||||
'';
|
||||
|
||||
virtualisation.oci-containers.containers = {
|
||||
arcane = {
|
||||
image = "ghcr.io/getarcaneapp/manager:${arcaneVersion}";
|
||||
autoStart = true;
|
||||
|
||||
login = mylib.containers.mkDockerLogin config;
|
||||
|
||||
dependsOn = [];
|
||||
|
||||
ports = [
|
||||
# "3552:3552"
|
||||
];
|
||||
|
||||
volumes = [
|
||||
"/var/run/docker.sock:/var/run/docker.sock"
|
||||
|
||||
"arcane_data:/app/data"
|
||||
"/media/synology-syncthing:/backups"
|
||||
];
|
||||
|
||||
environment = {
|
||||
APP_URL = "https://arcane.think.chriphost.de";
|
||||
|
||||
PUID = "1000";
|
||||
PGID = "1000";
|
||||
TZ = "Europe/Berlin";
|
||||
};
|
||||
|
||||
environmentFiles = [
|
||||
config.sops.templates."arcane_secrets.env".path
|
||||
];
|
||||
|
||||
extraOptions = [
|
||||
# "--privileged"
|
||||
# "--device=nvidia.com/gpu=all"
|
||||
"--net=behind-nginx"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
mylib,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
boxVersion = "v0.30.1";
|
||||
in {
|
||||
virtualisation.oci-containers.containers = {
|
||||
box = {
|
||||
image = "stashapp/stash:${boxVersion}";
|
||||
autoStart = true;
|
||||
|
||||
login = mylib.containers.mkDockerLogin config;
|
||||
|
||||
dependsOn = [];
|
||||
|
||||
ports = [
|
||||
# "9999:9999"
|
||||
];
|
||||
|
||||
volumes = [
|
||||
"/etc/localtime:/etc/localtime:ro"
|
||||
|
||||
"/media/Box:/data"
|
||||
|
||||
"box_config:/root/.stash"
|
||||
"box_metadata:/metadata"
|
||||
"box_cache:/cache"
|
||||
"box_blobs:/blobs"
|
||||
"box_generated:/generated"
|
||||
];
|
||||
|
||||
environment = {
|
||||
PUID = "3000";
|
||||
PGID = "3000";
|
||||
TZ = "Europe/Berlin";
|
||||
|
||||
STASH_STASH = "/data/";
|
||||
STASH_GENERATED = "/generated/";
|
||||
STASH_METADATA = "/metadata/";
|
||||
STASH_CACHE = "/cache/";
|
||||
};
|
||||
|
||||
extraOptions = [
|
||||
"--privileged"
|
||||
"--device=nvidia.com/gpu=all"
|
||||
"--net=behind-nginx"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
{
|
||||
mylib,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
# comfyuiVersion = "cu128-slim-20260316";
|
||||
comfyuiVersion = "cu128-megapak-20260323";
|
||||
in {
|
||||
virtualisation.oci-containers.containers = {
|
||||
comfyui = {
|
||||
image = "yanwk/comfyui-boot:${comfyuiVersion}";
|
||||
autoStart = false;
|
||||
|
||||
login = mylib.containers.mkDockerLogin config;
|
||||
|
||||
dependsOn = [];
|
||||
|
||||
ports = [
|
||||
"8188:8188"
|
||||
];
|
||||
|
||||
volumes = let
|
||||
rootDir = "/home/christoph/Games/ComfyUI";
|
||||
in [
|
||||
"${rootDir}/storage:/root"
|
||||
"${rootDir}/storage-models/models:/root/ComfyUI/models"
|
||||
"${rootDir}/storage-models/hf-hub:/root/.cache/huggingface/hub"
|
||||
"${rootDir}/storage-models/torch-hub:/root/.cache/torch/hub"
|
||||
"${rootDir}/storage-user/input:/root/ComfyUI/input"
|
||||
"${rootDir}/storage-user/output:/root/ComfyUI/output"
|
||||
"${rootDir}/storage-user/workflows:/root/ComfyUI/user/default/workflows"
|
||||
];
|
||||
|
||||
environment = {
|
||||
PUID = "1000";
|
||||
PGID = "1000";
|
||||
TZ = "Europe/Berlin";
|
||||
|
||||
# https://github.com/Comfy-Org/ComfyUI/blob/master/comfy/cli_args.py
|
||||
# --use-sage-attention # => OOM
|
||||
# --lowvram
|
||||
# --disable-pinned-memory
|
||||
# --cache-none
|
||||
# CLI_ARGS = "--use-sage-attention";
|
||||
};
|
||||
|
||||
extraOptions = [
|
||||
"--privileged"
|
||||
"--device=nvidia.com/gpu=all"
|
||||
# "--net=behind-nginx"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
fileflowsVersion = "26.06";
|
||||
fileflowsVersion = "26.01";
|
||||
in {
|
||||
virtualisation.oci-containers.containers = {
|
||||
fileflows-node = {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
version = "26.06";
|
||||
version = "26.01";
|
||||
in {
|
||||
virtualisation.oci-containers.containers = {
|
||||
fileflows = {
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
giteaVersion = "1.27.0";
|
||||
runnerVersion = "0.6.1";
|
||||
giteaVersion = "1.24.2";
|
||||
runnerVersion = "0.2.12";
|
||||
in {
|
||||
users = {
|
||||
groups.git = {};
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
}: let
|
||||
vectorchordVersion = "0.4.2";
|
||||
pgvectorsVersion = "0.2.0";
|
||||
immichVersion = "3.2.0-cuda";
|
||||
immichVersion = "2.5.2";
|
||||
in {
|
||||
virtualisation.oci-containers.containers = {
|
||||
immich-database = {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
jellyfinVersion = "version-12.1ubu2604";
|
||||
jellyfinVersion = "10.11.2";
|
||||
in {
|
||||
virtualisation.oci-containers.containers = {
|
||||
jellyfin = {
|
||||
|
||||
@@ -18,7 +18,8 @@ in {
|
||||
];
|
||||
|
||||
volumes = [
|
||||
"/home/christoph/ssd/kiwix:/data"
|
||||
# TODO: Add network location for .zim files
|
||||
"kiwix_data:/data"
|
||||
];
|
||||
|
||||
environment = {
|
||||
|
||||
@@ -30,24 +30,20 @@ in {
|
||||
volumes = let
|
||||
# TODO: Setup on ThinkNix: adguard_config, adguard_work, portainer_config
|
||||
backup = [
|
||||
"arcane-agent_data"
|
||||
"authelia_config"
|
||||
"bazarr_config"
|
||||
"fileflows_data"
|
||||
"formula10_cache"
|
||||
"formula10_data"
|
||||
"formula11_pb_data"
|
||||
"formula12_pb_data"
|
||||
"gitea-db_data"
|
||||
"gitea_data"
|
||||
"gitea-runner_config"
|
||||
"gitea-runner_data"
|
||||
"gitea_data"
|
||||
"heidi_config"
|
||||
"immich-database_data"
|
||||
"immich_config"
|
||||
"immich_data"
|
||||
"immich_machine-learning"
|
||||
"jellyfin_config"
|
||||
"kopia_config"
|
||||
"nextcloud-db_data"
|
||||
"nextcloud_data"
|
||||
"nginx_config"
|
||||
@@ -55,13 +51,6 @@ in {
|
||||
"nginx_snippets"
|
||||
"paperless-postgres_data"
|
||||
"paperless_data"
|
||||
"prowlarr_config"
|
||||
"radarr_config"
|
||||
"sabnzbd-movies_config"
|
||||
"sabnzbd-shows_config"
|
||||
"sonarr_config"
|
||||
"teamspeak_data2"
|
||||
"tinymediamanager_data"
|
||||
];
|
||||
|
||||
mkVolume = name: "${name}:/data/${name}:ro";
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
nextcloudVersion = "33.0.5-apache";
|
||||
nextcloudVersion = "31.0.6-apache";
|
||||
in {
|
||||
systemd.services.nextcloud-cron = {
|
||||
enable = true;
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
{
|
||||
mylib,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
ntfyVersion = "v2.21";
|
||||
in {
|
||||
# If we need to pass secrets to containers we can't use plain env variables.
|
||||
sops.templates."ntfy_secrets.env".content = ''
|
||||
NTFY_AUTH_USERS=${config.sops.placeholder.ntfy-auth-users}
|
||||
NTFY_AUTH_TOKENS=${config.sops.placeholder.ntfy-auth-tokens}
|
||||
'';
|
||||
|
||||
virtualisation.oci-containers.containers = {
|
||||
# NTFY_AUTH_USERS='admin:$2b$10$13iMkFcSNXcb/DKlUSS03OM25saLd8/hDlKkowFtXYctu2fQBoLJK:admin,christoph:$2b$10$8jgrgBltBXj/Qw0BxBWf1eIfH53VV6wTdlJZEqWBIH3htwEP9PKgq:user'
|
||||
# NTFY_AUTH_TOKENS="christoph:tk_rx8fd6hojuz4ekcb72j7juugkbmga:FAIL*-Notif"
|
||||
|
||||
# NTFY_BASE_URL="https://ntfy.vps.chriphost.de"
|
||||
# NTFY_BEHIND_PROXY="true"
|
||||
# NTFY_AUTH_FILE="/var/lib/ntfy/auth.db"
|
||||
# NTFY_AUTH_DEFAULT_ACCESS="deny-all"
|
||||
# NTFY_ENABLE_LOGIN="true"
|
||||
# NTFY_REQUIRE_LOGIN="true"
|
||||
# NTFY_ATTACHMENT_CACHE_DIR="/var/cache/ntfy/attachments"
|
||||
# NTFY_CACHE_FILE="/var/cache/ntfy/cache.db"
|
||||
# NTFY_UPSTREAM_BASE_URL="https://ntfy.sh"
|
||||
# NTFY_AUTH_ACCESS="christoph:*:read-write"
|
||||
ntfy = {
|
||||
image = "binwiederhier/ntfy:${ntfyVersion}";
|
||||
autoStart = true;
|
||||
|
||||
login = mylib.containers.mkDockerLogin config;
|
||||
|
||||
dependsOn = [];
|
||||
|
||||
ports = [
|
||||
"8042:80"
|
||||
];
|
||||
|
||||
volumes = [
|
||||
"ntfy_cache:/var/cache/ntfy"
|
||||
"ntfy_attachments:/var/cache/ntfy/attachments"
|
||||
"ntfy_lib:/var/lib/ntfy"
|
||||
"ntfy_etc:/etc/ntfy"
|
||||
];
|
||||
|
||||
cmd = ["serve"];
|
||||
|
||||
environment = {
|
||||
PUID = "1000";
|
||||
PGID = "1000";
|
||||
TZ = "Europe/Berlin";
|
||||
|
||||
NTFY_BASE_URL = "https://ntfy.vps.chriphost.de";
|
||||
NTFY_BEHIND_PROXY = "true";
|
||||
NTFY_AUTH_FILE = "/var/lib/ntfy/auth.db";
|
||||
NTFY_AUTH_DEFAULT_ACCESS = "deny-all";
|
||||
NTFY_ENABLE_LOGIN = "true";
|
||||
NTFY_REQUIRE_LOGIN = "true";
|
||||
NTFY_ATTACHMENT_CACHE_DIR = "/var/cache/ntfy/attachments";
|
||||
NTFY_CACHE_FILE = "/var/cache/ntfy/cache.db";
|
||||
NTFY_UPSTREAM_BASE_URL = "https://ntfy.sh";
|
||||
NTFY_AUTH_ACCESS = "christoph:*:read-write";
|
||||
};
|
||||
|
||||
environmentFiles = [
|
||||
config.sops.templates."ntfy_secrets.env".path
|
||||
];
|
||||
|
||||
extraOptions = [
|
||||
# "--privileged"
|
||||
# "--device=nvidia.com/gpu=all"
|
||||
"--net=behind-nginx"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
teamspeakVersion = "6.0.0-beta11";
|
||||
teamspeakVersion = "v6.0.0-beta7";
|
||||
in {
|
||||
virtualisation.oci-containers.containers = {
|
||||
teamspeak = {
|
||||
@@ -24,8 +24,7 @@ in {
|
||||
];
|
||||
|
||||
volumes = [
|
||||
# "teamspeak_data:/var/tsserver"
|
||||
"teamspeak_data2:/var/tsserver"
|
||||
"teamspeak_data:/var/tsserver"
|
||||
];
|
||||
|
||||
environment = {
|
||||
|
||||
@@ -42,13 +42,6 @@ in {
|
||||
|
||||
boot.lanzaboote = {
|
||||
enable = true;
|
||||
autoGenerateKeys.enable = true;
|
||||
|
||||
# WARN: Needs persistent /var/lib/auto-cryptenroll
|
||||
autoEnrollKeys = {
|
||||
enable = true;
|
||||
includeMicrosoftKeys = true;
|
||||
};
|
||||
|
||||
# WARN: Make sure to persist this if using impermanence!
|
||||
pkiBundle = "/var/lib/sbctl";
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
{...}: {
|
||||
imports = [
|
||||
./sops-nix
|
||||
];
|
||||
}
|
||||
@@ -72,6 +72,7 @@ in {
|
||||
if docker.podman
|
||||
then "podman"
|
||||
else "docker"; # "docker" or "podman"
|
||||
libvirtd.enable = true;
|
||||
};
|
||||
|
||||
systemd.services = let
|
||||
|
||||
@@ -30,7 +30,6 @@ in {
|
||||
# Sans/Serif fonts
|
||||
noto-fonts
|
||||
noto-fonts-color-emoji
|
||||
noto-fonts-cjk-serif
|
||||
noto-fonts-cjk-sans
|
||||
lxgw-wenkai
|
||||
];
|
||||
|
||||
@@ -69,14 +69,11 @@ in {
|
||||
# https://github.com/nix-community/impermanence/issues/253
|
||||
(mkRDir "/usr/systemd-placeholder" m755)
|
||||
|
||||
# TODO: Why does this use the mandb user?
|
||||
# (mkDir "mandb" "/var/cache/man" m755)
|
||||
|
||||
(mkDir "mandb" "/var/cache/man" m755)
|
||||
# (mkRDir "/var/cache/restic-backups-synology" m755)
|
||||
|
||||
(mkRDir "/var/db/sudo" m711)
|
||||
|
||||
(mkRDir "/var/lib/auto-cryptenroll" m755) # Lanzaboote
|
||||
(mkRDir "/var/lib/bluetooth" m755) # m700
|
||||
(mkRDir "/var/lib/btrfs" m755)
|
||||
(mkRDir "/var/lib/containers" m755)
|
||||
@@ -85,7 +82,7 @@ in {
|
||||
(mkRDir "/var/lib/libvirt" m755)
|
||||
(mkRDir "/var/lib/NetworkManager" m755)
|
||||
(mkRDir "/var/lib/nixos" m755)
|
||||
(mkRDir "/var/lib/sbctl" m755) # Lanzaboote
|
||||
(mkRDir "/var/lib/sbctl" m755)
|
||||
(mkRDir "/var/lib/systemd" m755)
|
||||
|
||||
(mkRDir "/var/tmp" m777)
|
||||
@@ -121,68 +118,49 @@ in {
|
||||
|
||||
# The shit some applications add to ~/ without asking
|
||||
# (mkUDir ".android" m755) # Unity
|
||||
(mkUDir ".claude" m755)
|
||||
(mkUDir ".codex" m755)
|
||||
# (mkUDir ".comfy" m755)
|
||||
(mkUDir ".docker" m755)
|
||||
# (mkUDir ".gradle" m755) # Unity
|
||||
(mkUDir ".java" m755) # JetBrains
|
||||
(mkUDir ".lmstudio" m755)
|
||||
(mkUDir ".MakeMKV" m755)
|
||||
(mkUDir ".mozilla/firefox" m755) # TODO: Remove this someday
|
||||
(mkUDir ".mozilla/native-messaging-hosts" m755)
|
||||
(mkUDir ".nix-package-search" m755)
|
||||
(mkUDir ".npm" m755) # Contains mcp servers :/
|
||||
# (mkUDir ".nv" m755) # Unity
|
||||
# (mkUDir ".ollama" m755)
|
||||
# (mkUDir ".plastic4" m755) # Unity
|
||||
(mkUDir ".tableplus" m755)
|
||||
(mkUDir ".tiddl" m755)
|
||||
(mkUDir ".var/app" m755)
|
||||
(mkUDir ".vim/undo" m755)
|
||||
(mkUDir ".vscode" m755)
|
||||
(mkUDir ".zotero" m755)
|
||||
|
||||
# Cache that's actually useful
|
||||
(mkUDir ".cache/claude-cli-nodejs" m755)
|
||||
(mkUDir ".cache/elephant" m755)
|
||||
(mkUDir ".cache/fish/generated_completions" m755)
|
||||
(mkUDir ".cache/nix" m755)
|
||||
(mkUDir ".cache/nix-index" m755)
|
||||
(mkUDir ".cache/nix-search-tv" m755)
|
||||
(mkUDir ".cache/nvim" m755)
|
||||
(mkUDir ".cache/JetBrains" m755)
|
||||
(mkUDir ".cache/keepassxc" m755)
|
||||
(mkUDir ".cache/opencode" m755)
|
||||
(mkUDir ".cache/uv" m755)
|
||||
|
||||
# Config
|
||||
# (mkUDir ".config/.android" m755) # Unity
|
||||
(mkUDir ".config/ai.opencode.desktop" m755)
|
||||
# (mkUDir ".config/beekeeper-studio" m755)
|
||||
(mkUDir ".config/beets" m755)
|
||||
(mkUDir ".config/blender" m755)
|
||||
(mkUDir ".config/chromium" m755)
|
||||
(mkUDir ".config/Claude" m755) # Claude desktop
|
||||
(mkUDir ".config/Code" m755)
|
||||
(mkUDir ".config/Codex" m755)
|
||||
(mkUDir ".config/chromium" m755) # TODO: Remove this someday
|
||||
(mkUDir ".config/Ferdium" m755)
|
||||
(mkUDir ".config/feishin" m755)
|
||||
(mkUDir ".config/fish/completions" m755)
|
||||
(mkUDir ".config/ghidra" m755)
|
||||
(mkUDir ".config/impermanence" m755)
|
||||
(mkUDir ".config/jellyfin-mpv-shim" m755)
|
||||
# (mkUDir ".config/jellyfin-tui" m755) # Configured using nix
|
||||
(mkUDir ".config/jellyfin-tui" m755) # TODO: Generate this config file, have to use sops because it includes the password in cleartext
|
||||
(mkUDir ".config/JetBrains" m755)
|
||||
(mkUDir ".config/kdeconnect" m755)
|
||||
(mkUDir ".config/keepassxc" m755)
|
||||
(mkUDir ".config/LM Studio" m755)
|
||||
(mkUDir ".config/Msty" m755)
|
||||
(mkUDir ".config/Nextcloud" m755)
|
||||
# (mkUDir ".config/niri/dms" m755)
|
||||
(mkUDir ".config/niri/dms" m755)
|
||||
(mkUDir ".config/obsidian" m755)
|
||||
(mkUDir ".config/obs-studio" m755)
|
||||
(mkUDir ".config/opencode" m755)
|
||||
(mkUDir ".config/Signal" m755)
|
||||
# (mkUDir ".config/singularitygroup-hotreload" m755) # Unity
|
||||
(mkUDir ".config/TeamSpeak" m755)
|
||||
@@ -190,7 +168,6 @@ in {
|
||||
(mkUDir ".config/tidal_dl_ng" m755)
|
||||
# (mkUDir ".config/unity3d" m755) # Unity
|
||||
# (mkUDir ".config/unityhub" m755) # Unity
|
||||
(mkUDir ".config/Vector 35" m755)
|
||||
(mkUDir ".config/vlc" m755)
|
||||
(mkUDir ".config/Zeal" m755)
|
||||
(mkUDir ".config/zed" m755)
|
||||
@@ -214,7 +191,6 @@ in {
|
||||
(mkUDir ".local/share/net.lrclib.lrcget" m755)
|
||||
(mkUDir ".local/share/nix" m755)
|
||||
(mkUDir ".local/share/nvim" m755)
|
||||
(mkUDir ".local/share/opencode" m755)
|
||||
(mkUDir ".local/share/qutebrowser" m755)
|
||||
(mkUDir ".local/share/systemd" m755)
|
||||
# (mkUDir ".local/share/unity3d" m755) # Unity
|
||||
@@ -227,7 +203,6 @@ in {
|
||||
(mkUDir ".local/state/lazygit" m755)
|
||||
(mkUDir ".local/state/nix" m755)
|
||||
(mkUDir ".local/state/nvim" m755)
|
||||
(mkUDir ".local/state/opencode" m755)
|
||||
(mkUDir ".local/state/waypaper" m755)
|
||||
(mkUDir ".local/state/wireplumber" m755)
|
||||
];
|
||||
|
||||
@@ -21,7 +21,7 @@ in {
|
||||
${mime.defaultTextEditor} = mime.textTypes;
|
||||
${mime.defaultFileBrowser} = ["inode/directory"];
|
||||
${mime.defaultWebBrowser} = mime.webTypes;
|
||||
${mime.defaultPdfViewer} = ["application/pdf" "application/epub+zip"];
|
||||
${mime.defaultPdfViewer} = ["application/pdf"];
|
||||
${mime.defaultImageViewer} = mime.imageTypes;
|
||||
|
||||
# If audio and video player are equal, we assign all types to the audio player,
|
||||
@@ -75,11 +75,6 @@ in {
|
||||
"chromium-browser.desktop"
|
||||
"com.google.Chrome.desktop"
|
||||
"firefox.desktop"
|
||||
"org.onlyoffice.desktopeditors.desktop"
|
||||
"calibre-ebook-edit.desktop"
|
||||
"calibre-ebook-viewer.desktop"
|
||||
"calibre-gui.desktop"
|
||||
"calibre-lrfviewer.desktop"
|
||||
];
|
||||
"text/plain" = [
|
||||
"firefox.desktop"
|
||||
|
||||
@@ -26,23 +26,17 @@ in {
|
||||
defaultSopsFile = ./secrets.yaml;
|
||||
|
||||
age = {
|
||||
keyFile = lib.mkDefault "${config.users.users.${username}.home}/.secrets/age/age.key";
|
||||
keyFile = lib.mkDefault "/home/${username}/.secrets/age/age.key";
|
||||
generateKey = false;
|
||||
sshKeyPaths = [];
|
||||
};
|
||||
|
||||
secrets = let
|
||||
mkSecret = name: {
|
||||
${name} = lib.mkMerge [
|
||||
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
|
||||
owner = config.users.users.${username}.name;
|
||||
group = config.users.users.${username}.group;
|
||||
})
|
||||
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isDarwin {
|
||||
owner = config.users.users.${username}.name;
|
||||
group = "staff"; # Apparently there's no way to get the primary group?
|
||||
})
|
||||
];
|
||||
${name} = {
|
||||
owner = config.users.users.${username}.name;
|
||||
group = config.users.users.${username}.group;
|
||||
};
|
||||
};
|
||||
|
||||
mkBootSecret = name: {
|
||||
|
||||
@@ -5,34 +5,27 @@ user-password: ENC[AES256_GCM,data:okgvaTTesCDwriI8PxhNdHZF8XgzB4yxapuFl2/CK8x4W
|
||||
ssh-private-key: ENC[AES256_GCM,data:JrRarfeS3y6b9gxg4Za5GIc5Ci3aGR+OyZxQybj4dcv2mzxXmT/bm7KOwM1zkz1PFl1xW5X82T5jte+XQOKx0+6m4ovjUgUmQUMP4E/yosp8XSdi0+YlUKBEHEJx6HqCZy+v6qx5kfp9JC6fZqCbL1J6FIqWqAoKTFXoiou1YnhmBa2fM17Q++i6TflDWiVrUS7X9xjuZFq1hz1aQXS303uvJEUOEpXdqPyJvUKJWzVsFrAwpa9FG+reO70SSc+1hBbqdw1QjrzNWh3eNnztwZURauJtVFBYUZ5ozHmWBr4aVFjYvqz+t6G1SAunmBRbVqbH4bjBv9jXXjHAB4U0wanvkJN2C+EY1zxwjyx2fWckMdhoLr9gtC1FJKMbV49UFHJ3iXWNczKj1t7LrctehEKXJa0Eb3UogYuaRxbVYbC++kD8LvL4AY8ertgc9/pxQQZmogdINJmIxKN4HTlGbX8kSDLbohZLheOfzZ5ycTlrbOjfJ1EBMLo+mJcMUW0qhFySl1aamPqTeII7lvgTOE3xV/d/9VAQTFKsftWPNkfhAJIym51bYrrMPV8AVeFQnLhSid3d3zK4w20zIQKSYnq9A8zcNhM0keddiv4XC+M=,iv:7HP7VCFpMRZXRD6GD/zFzDSBO02V/DyxKLmuDCLXTLU=,tag:Ugx81JwCP8HmhtflYoevLg==,type:str]
|
||||
nix-github-token: ENC[AES256_GCM,data:AXV0ODLhfa4M6+7clulfIKm0qCOeo3lQ+66iYgoDeR12RxZOV19UtA==,iv:1XECVKyzH3NumKwRSPKNlUwJMLFwptcG8DQ09U4LrGk=,tag:QdtvJNV8BttWjhH4v0RtRQ==,type:str]
|
||||
docker-password: ENC[AES256_GCM,data:mK5YWEQPKWBtVCgRBZvwWTdVAi8MEGbLnLeP7hfDkcc=,iv:Az8+eAK6R6xssmmbhuEsDbLU+ks8lS+qzc4L33WfefA=,tag:NSXvRhbIuRZZqRR28Tu0PQ==,type:str]
|
||||
jellyfin-password: ENC[AES256_GCM,data:ugfwgpkIiLY0O+m/UGnBB5AFPBkCcai+RQOkxiCSohE=,iv:VP+Jyv2lUIBz1dFow038uN0KT+tQKK9uGr7/T5crlgk=,tag:rPGPpaqZApfHkecLBSs4Yw==,type:str]
|
||||
#
|
||||
#ENC[AES256_GCM,data:y5dlZFhK38dR+Q==,iv:1JYizUeyWeMR4KUblkj7kVSHPCL5l8mFpaQdo774BcM=,tag:kUTnBZb46KYQyi8bgIYSOQ==,type:comment]
|
||||
#
|
||||
makemkv-app-key: ENC[AES256_GCM,data:/pTxr4q4ucJLx5VI8ySzOgd4g1s+6lcZNe4crxRmidTYrhJ0I6V3CIhm4wLC105W+Xka6HIZTqPn8SbqcMC4Dt3wSus=,iv:aYsGobD+Vl/VUNAHcAxQb7HEmLT8aXyKNOELgzvKDH4=,tag:xhnVb/ns6VZEnTuoUv9w5A==,type:str]
|
||||
restic-repo-key: ENC[AES256_GCM,data:lSFuhjbhdQq4cabAVFGQ4kuaJxb7EhXgBDlgoEQWJhs=,iv:7IhGDBYEwY1TwLvc/4DOkUBQ3eqSszZcKwnT7Lllfps=,tag:yJVlMi9X0W+Kh3zMkb0QuA==,type:str]
|
||||
context7-api-key: ENC[AES256_GCM,data:lZfrz5pBDybBkswgZM3jKLM9bdXOXeFUI9wFB8BJ5aLYqmf2oRHIJi/85w==,iv:MQYZKsTG++CYfpJret1WSv7+q2ZmONCDl4OwdRo+YUk=,tag:MrWBn3CKDUDZLLIFZWV0tA==,type:str]
|
||||
obsidian-rest-api-key: ENC[AES256_GCM,data:+CmQAX0AoSmCPMF9QL3NkWVArt7N0Ci9obHKpwQUPolcdsTnAsPMWu6GAWVvqs8Qmjz5Hk3gwM0YP2JdLEF0cw==,iv:U1SsPdiJIT7q+md1Q61Ro530s7vrl+XBgu+6/ffcrEQ=,tag:xrTRPve9DcumQjlr+aKsLg==,type:str]
|
||||
#
|
||||
#ENC[AES256_GCM,data:Raagjz1qPvXC,iv:OSWTKaIlmo1paU2ZZn20XMeZ2gdM52pHmVZ3m2ngCdI=,tag:bPCdvjOFjpxxkrwA7Mhl5Q==,type:comment]
|
||||
#
|
||||
heidi-discord-token: ENC[AES256_GCM,data:FYvfUn8tG7glqIomSDj9rGyNQjnHSCsD/C3Kk/JR1vm/xkrxzXwP3rpyxAzqRQ7vd+zFBf2BJfV/zMk=,iv:b+aKcu98rxslEGSYf6t/jGwPfS256WQ3B/iuQ4Qeykk=,tag:e48Q0BraIvItyD2WBfbYEA==,type:str]
|
||||
kopia-server-username: ENC[AES256_GCM,data:4onewFkWpi9g,iv:aA4WSS8T6KUcGbAIHDd8BjE0sRK/Qz0j4QvEnKdlt2U=,tag:FQlB0Wx2u8wT3TKIhMAyLg==,type:str]
|
||||
kopia-server-password: ENC[AES256_GCM,data:6nMnhRA=,iv:Qz9qP+m0obzL+eHFmW1qVmc/0TR4Iw4X1GL4zACOSMk=,tag:v3v+33+g4y6se5q+b4e8mA==,type:str]
|
||||
kopia-user-password: ENC[AES256_GCM,data:W8BdbqI=,iv:JoH0ig8X+h/+bmQvzWnDo8yu1SZyE8fCwTLyyZHmDAI=,tag:foH5Es/5CBOysD4JjQzDdA==,type:str]
|
||||
kopia-user-password: ENC[AES256_GCM,data:jPWeru4e2w9qzA==,iv:WpZS3Qmx8v12v3q1Lq1YrPnWw7BY0FhxurXYuaOdfwA=,tag:+8bQAnHRh55rUMdyoK6N8w==,type:str]
|
||||
paperless-nextcloud-sync-password: ENC[AES256_GCM,data:pfLg3OVBqLsM4R7mSgLQEachj9gMkexPjBMSyzU=,iv:XBe1cdwlTjPfQW70NIEjD8CikK58iGErI9ZTlLWtCA4=,tag:qO35GdjljgS3/z5/1fCOFg==,type:str]
|
||||
ntfy-auth-users: ENC[AES256_GCM,data:IHnJJgUL9RqkEAoJ2Q9Oo0RkfgLXG7vih5NFPrPNBoIzMafdLXxHqNOAd1oRaOUd6AKmWdQ3uKAZINj7oGZEKMsMxUEv1WW6IXUuPnDeJe5EthINWCuaW2Z64PJl+uqgnWr4wDi7QT0zwjb/oL3gYfjH1xtfMadTzkWbmnxQ9jlP/nXe9JR1/oCrHv3dio5uU017cA==,iv:JmWnu25ZB/qqI2RsgHQ0bcat69V7p5MJ6cf5eFcSsns=,tag:6Z2LseCav/qyLh2nn+7uuw==,type:str]
|
||||
ntfy-auth-tokens: ENC[AES256_GCM,data:C23r9djvEukUgDDloFGm52spwcW1DB5Jcwt9kxghLjL3vNiQ9HzGrvlSl5oEppoNa23BF0+t,iv:O9LepUKGbyXTHMvwn1avdJEhcMgtr2Sb1imIJ8ALMYY=,tag:o3g6f7YZL2VfgfeymzJK1g==,type:str]
|
||||
arcane-agent-key: ENC[AES256_GCM,data:jbk1yiE1R2teclJc233qVvHOf+fvmQR/trPoVPMmnLz12rPFa/pciwaIne2SjacpJjxzqYDuJJqcwdYtOXAHzLBCXaQ=,iv:tZGQxfaUEccH/n62H5oP8X3K+UWrIvmthiywpSrejkY=,tag:UEGPBox7j2qiF+uyWRTZaw==,type:str]
|
||||
#
|
||||
#ENC[AES256_GCM,data:Gdh/hjCaOuAE,iv:XjPXn3SskpUPUkDIEDl5701/g9QhuS83fACMaoPMiIM=,tag:Q7s8xZG/GsOtQrasekBnkQ==,type:comment]
|
||||
#
|
||||
wireguard-vps-private-key: ENC[AES256_GCM,data:B6IWYuzKV9YZ+G9GIjOsXVEVugwMY14PrwmYyHsFAJEb1OJRXMg8+zeFnqs=,iv:2QroGA10UVSmNIBHFSTeCgMBD3VjtiUnng3pkR/mPVQ=,tag:FGlCrmdccgsObyut6E5ggA==,type:str]
|
||||
arcane-encryption-key: ENC[AES256_GCM,data:4H2kaQwIV5m0FVv+3IlNaw85V00r8W4SQ5cOSOskljtaUkFUteHzamj9KH7NxdKY+pxFkrvwIOIAhNYQTMRBSQ==,iv:FDx8IYu7B7jENtGnFiS7U7W2pDIwz9ibfuCNL0UBX6c=,tag:WSm/SwCs8sSynXeXi3+muw==,type:str]
|
||||
arcane-jwt-secret: ENC[AES256_GCM,data:BMC/Hju/FkHxXjdZrVr9xjiqs9Uny/w/k14K+b+DYgPOlPYMH+YSZQ/3/yyw5j52FNcm+lDG2drTaO0NfBKJsQ==,iv:gHU78Fw1L6Igp+Jewq5xqW39tSGvGh/HREcd+HX/nO4=,tag:KTL21t2kKWsB3zm7x+T0SA==,type:str]
|
||||
sops:
|
||||
age:
|
||||
- enc: |
|
||||
- recipient: age14ph8vrj657e7s35d60xehzuq46t9zd6pzcm6pw4jragzrvf6xs9s77usnm
|
||||
enc: |
|
||||
-----BEGIN AGE ENCRYPTED FILE-----
|
||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWSVRhVDREMXduZElrRklE
|
||||
R2s3Y081TGVTOCtKWVVWN0RLb0ZIT3lmMTNZCjFaNmRqb2hRVXFDSU12dFhDNmJo
|
||||
@@ -40,8 +33,7 @@ sops:
|
||||
SURMTmh1TGIrRmtENzc0Sk4rNFJNUE0KOpjN6jkEHO+lvdWdp4P++r9SNSPWaT0h
|
||||
FAbbvZZ/EdIk/njLEcayFN7B4ftTcD/f4XJZiyosilZnIkk76bMOHA==
|
||||
-----END AGE ENCRYPTED FILE-----
|
||||
recipient: age14ph8vrj657e7s35d60xehzuq46t9zd6pzcm6pw4jragzrvf6xs9s77usnm
|
||||
lastmodified: "2026-09-14T21:08:40Z"
|
||||
mac: ENC[AES256_GCM,data:tfkmsJfWYV11ruw8fCUkJ2gWQAvQJ4Gmsz72LnmiCdlvzeo4x9iM268ZJnuaPRuv6BXLp2XGGA4CbqhfZbO6cRxAawVfbxY2IRSo1JWITIY8qxKLb07jDMpQu/JjJz7J5T556UEvOsW6HrK3d0xvNlJ4yQIuVCBjttKTdRu5g9Y=,iv:mV5i0xJGu6fnSNPLm9J3NDDgN+sB6iadue917UjR+oU=,tag:h/vaeQ02wK/qKANerWIywQ==,type:str]
|
||||
lastmodified: "2025-07-19T01:29:00Z"
|
||||
mac: ENC[AES256_GCM,data:IzLYRuOlkUpry37sw7OB5MglntVflMjCcNiWpi7rvT2suOivLX9IT36qZFfYIbVIFXDmfsi1hsTvsPyekD7vVWQ1vkajAlGQYYTVpnO2cFrK3+TfWCyYjiD01rQBiRikybrR11zWRq6atieurDIxMUMEI7ypiqFOwpYaqSePAFc=,iv:9bc6rc4gjuiJWNjg1g0KfySqxnPjpzmlzDi/R+Iv2g4=,tag:tEwthVZAmdXbwRtoNykGrQ==,type:str]
|
||||
unencrypted_suffix: _unencrypted
|
||||
version: 3.13.3
|
||||
version: 3.10.2
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
|
||||
# General services
|
||||
../services/adguard.nix
|
||||
../services/arcane.nix
|
||||
../services/nginx-proxy-manager.nix
|
||||
# ../services/portainer.nix
|
||||
# ../services/pulse.nix
|
||||
# ../services/pulse-agent-thinknix.nix
|
||||
# ../services/whats-up-docker.nix
|
||||
../services/portainer.nix
|
||||
../services/pulse.nix
|
||||
../services/pulse-agent-thinknix.nix
|
||||
../services/whats-up-docker.nix
|
||||
];
|
||||
|
||||
systemmodules = {
|
||||
@@ -68,8 +67,7 @@
|
||||
};
|
||||
|
||||
sops-nix.secrets.${username} = [
|
||||
"arcane-encryption-key"
|
||||
"arcane-jwt-secret"
|
||||
# "wireguard-vps-private-key"
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 13 MiB |
BIN
Binary file not shown.
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user