1
0
Fork 0
forked from fabian/nix_config

Compare commits

...

46 commits

Author SHA1 Message Date
Fabian Montero 98a32736d6
remove tooltip from waybar clock 2025-08-09 14:13:27 -06:00
Fabian Montero 4807859d85
add mako config 2025-08-09 14:11:14 -06:00
Fabian Montero a715f50f2b
update readme 2025-08-08 15:52:53 -06:00
Fabian Montero abb4fe5712
update gtlock style 2025-08-08 15:32:34 -06:00
Fabian Montero b149e90f67
update sway config 2025-08-08 15:32:20 -06:00
Fabian Montero 9dc042fcce
flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/ce01daebf8489ba97bd1609d185ea276efdeb121?narHash=sha256-1ziydHSiDuSnaiPzCQh1mRFBsM2d2yRX9I%2B5OPGEmIE%3D' (2025-08-04)
  → 'github:nixos/nixpkgs/e728d7ae4bb6394bbd19eec52b7358526a44c414?narHash=sha256-YzNTExe3kMY9lYs23mZR7jsVHe5TWnpwNrsPOpFs/b8%3D' (2025-08-07)
• Updated input 'nur':
    'github:nix-community/NUR/0d75abff8343adaa20cd89b79e1f58d334101534?narHash=sha256-5aNGYEe4nf4IkFw2JN2v3jpcqLhRwCY0rlVhGtOYcV4%3D' (2025-08-07)
  → 'github:nix-community/NUR/a7f9761c9dd71359cd9a6529078302a83e6deaac?narHash=sha256-GH%2BUMIOJj7u/bW55dOOpD8HpVpc9WfU61iweM2nM68A%3D' (2025-08-08)
• Updated input 'nur/nixpkgs':
    'github:nixos/nixpkgs/5b09dc45f24cf32316283e62aec81ffee3c3e376?narHash=sha256-Q/I2xJn/j1wpkGhWkQnm20nShYnG7TI99foDBpXm1SY%3D' (2025-08-03)
  → 'github:nixos/nixpkgs/c2ae88e026f9525daf89587f3cbee584b92b6134?narHash=sha256-erbiH2agUTD0Z30xcVSFcDHzkRvkRXOQ3lb887bcVrs%3D' (2025-08-06)
• Updated input 'unstable':
    'github:nixos/nixpkgs/5b09dc45f24cf32316283e62aec81ffee3c3e376?narHash=sha256-Q/I2xJn/j1wpkGhWkQnm20nShYnG7TI99foDBpXm1SY%3D' (2025-08-03)
  → 'github:nixos/nixpkgs/c2ae88e026f9525daf89587f3cbee584b92b6134?narHash=sha256-erbiH2agUTD0Z30xcVSFcDHzkRvkRXOQ3lb887bcVrs%3D' (2025-08-06)
• Updated input 'vpsadminos':
    'github:vpsfreecz/vpsadminos/483e04c5556e7a42a0dcd176caab7ad450244515?narHash=sha256-gVTM1eIYzHx/Z/2WVhhf3Eov3JuARF5fuIrWjvc73wo%3D' (2025-08-03)
  → 'github:vpsfreecz/vpsadminos/94f162b0a1194115a289b2f1e0f9d13b200d6d0e?narHash=sha256-Vuc6jQNHsXhzJGusRG%2BK9fcI5aEnW9ZQRK22dlM0e2A%3D' (2025-08-08)
2025-08-08 14:59:29 -06:00
Fabian Montero 0d7022d7c1
add privacy and disk to waybar 2025-08-08 13:57:57 -06:00
Fabian Montero 158c761ae2
replace wofi with bemenu 2025-08-08 13:26:38 -06:00
Fabian Montero 6382debb3b
configure sway colors 2025-08-08 11:22:38 -06:00
Fabian Montero aa7265e49e
add and configure gtklock 2025-08-08 10:49:07 -06:00
Fabian Montero ef8b281c19
configure tmux 2025-08-08 00:44:41 -06:00
Fabian Montero 5d1408254a
configure sway (this is a huge rice) 2025-08-07 16:48:34 -06:00
Fabian Montero 4316165e9d
remove conduwuit 2025-08-06 22:33:18 -06:00
Fabian Montero edeeb5c169
flake.lock: Update
Flake lock file updates:

• Removed input 'conduwuit'
• Removed input 'conduwuit/attic'
• Removed input 'conduwuit/attic/crane'
• Removed input 'conduwuit/attic/crane/nixpkgs'
• Removed input 'conduwuit/attic/flake-compat'
• Removed input 'conduwuit/attic/flake-utils'
• Removed input 'conduwuit/attic/nixpkgs'
• Removed input 'conduwuit/attic/nixpkgs-stable'
• Removed input 'conduwuit/cachix'
• Removed input 'conduwuit/cachix/devenv'
• Removed input 'conduwuit/cachix/devenv/cachix'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/flake-compat'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/nix'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/nix/flake-compat'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/nix/nixpkgs'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/nix/nixpkgs-regression'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/nixpkgs'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/poetry2nix'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/poetry2nix/flake-utils'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/poetry2nix/flake-utils/systems'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/poetry2nix/nix-github-actions'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/poetry2nix/nix-github-actions/nixpkgs'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/poetry2nix/nixpkgs'
• Removed input 'conduwuit/cachix/devenv/cachix/devenv/pre-commit-hooks'
• Removed input 'conduwuit/cachix/devenv/cachix/flake-compat'
• Removed input 'conduwuit/cachix/devenv/cachix/nixpkgs'
• Removed input 'conduwuit/cachix/devenv/cachix/pre-commit-hooks'
• Removed input 'conduwuit/cachix/devenv/flake-compat'
• Removed input 'conduwuit/cachix/devenv/nix'
• Removed input 'conduwuit/cachix/devenv/nix/flake-compat'
• Removed input 'conduwuit/cachix/devenv/nix/nixpkgs'
• Removed input 'conduwuit/cachix/devenv/nix/nixpkgs-regression'
• Removed input 'conduwuit/cachix/devenv/nixpkgs'
• Removed input 'conduwuit/cachix/devenv/pre-commit-hooks'
• Removed input 'conduwuit/cachix/flake-compat'
• Removed input 'conduwuit/cachix/nixpkgs'
• Removed input 'conduwuit/cachix/pre-commit-hooks'
• Removed input 'conduwuit/cachix/pre-commit-hooks/flake-compat'
• Removed input 'conduwuit/cachix/pre-commit-hooks/gitignore'
• Removed input 'conduwuit/cachix/pre-commit-hooks/gitignore/nixpkgs'
• Removed input 'conduwuit/cachix/pre-commit-hooks/nixpkgs'
• Removed input 'conduwuit/cachix/pre-commit-hooks/nixpkgs-stable'
• Removed input 'conduwuit/complement'
• Removed input 'conduwuit/crane'
• Removed input 'conduwuit/crane/nixpkgs'
• Removed input 'conduwuit/fenix'
• Removed input 'conduwuit/fenix/nixpkgs'
• Removed input 'conduwuit/fenix/rust-analyzer-src'
• Removed input 'conduwuit/flake-compat'
• Removed input 'conduwuit/flake-utils'
• Removed input 'conduwuit/flake-utils/systems'
• Removed input 'conduwuit/liburing'
• Removed input 'conduwuit/nix-filter'
• Removed input 'conduwuit/nixpkgs'
• Removed input 'conduwuit/rocksdb'
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/3ff0e34b1383648053bba8ed03f201d3466f90c9?narHash=sha256-CdX2Rtvp5I8HGu9swBmYuq%2BILwRxpXdJwlpg8jvN4tU%3D' (2025-07-24)
  → 'github:nixos/nixpkgs/ce01daebf8489ba97bd1609d185ea276efdeb121?narHash=sha256-1ziydHSiDuSnaiPzCQh1mRFBsM2d2yRX9I%2B5OPGEmIE%3D' (2025-08-04)
• Updated input 'nur':
    'github:nix-community/NUR/445dc705bfda4e2c67c19d1f6646609fa4198342?narHash=sha256-dWNJiSUVglc9HPepthYNbOOmqbfYlW/3fxxG3tsE1b0%3D' (2025-07-28)
  → 'github:nix-community/NUR/0d75abff8343adaa20cd89b79e1f58d334101534?narHash=sha256-5aNGYEe4nf4IkFw2JN2v3jpcqLhRwCY0rlVhGtOYcV4%3D' (2025-08-07)
• Updated input 'nur/nixpkgs':
    'github:nixos/nixpkgs/7fd36ee82c0275fb545775cc5e4d30542899511d?narHash=sha256-9h7%2B4/53cSfQ/uA3pSvCaBepmZaz/dLlLVJnbQ%2BSJjk%3D' (2025-07-25)
  → 'github:nixos/nixpkgs/5b09dc45f24cf32316283e62aec81ffee3c3e376?narHash=sha256-Q/I2xJn/j1wpkGhWkQnm20nShYnG7TI99foDBpXm1SY%3D' (2025-08-03)
• Added input 'trivionomicon':
    'git+https://git.posixlycorrect.com/deepState/trivionomicon?ref=master&rev=c651b8c4706cfc750303db12ae19e58164a6bebb' (2025-08-06)
• Added input 'trivionomicon/flake-utils':
    'github:numtide/flake-utils/11707dc2f618dd54ca8739b309ec4fc024de578b?narHash=sha256-l0KFg5HjrsfsO/JpG%2Br7fRrqm12kzFHyUHqHCVpMMbI%3D' (2024-11-13)
• Added input 'trivionomicon/flake-utils/systems':
    'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e?narHash=sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768%3D' (2023-04-09)
• Added input 'trivionomicon/nixpkgs':
    follows 'nixpkgs'
• Updated input 'unstable':
    'github:nixos/nixpkgs/7fd36ee82c0275fb545775cc5e4d30542899511d?narHash=sha256-9h7%2B4/53cSfQ/uA3pSvCaBepmZaz/dLlLVJnbQ%2BSJjk%3D' (2025-07-25)
  → 'github:nixos/nixpkgs/5b09dc45f24cf32316283e62aec81ffee3c3e376?narHash=sha256-Q/I2xJn/j1wpkGhWkQnm20nShYnG7TI99foDBpXm1SY%3D' (2025-08-03)
• Updated input 'vpsadminos':
    'github:vpsfreecz/vpsadminos/93226272f9854ef148a30cbb388c3a9932a18f3b?narHash=sha256-7LN%2BI58H/7WWKrDz5Ic9aLdqN0gzOUCX2kaT/hBrjlk%3D' (2025-07-27)
  → 'github:vpsfreecz/vpsadminos/483e04c5556e7a42a0dcd176caab7ad450244515?narHash=sha256-gVTM1eIYzHx/Z/2WVhhf3Eov3JuARF5fuIrWjvc73wo%3D' (2025-08-03)
2025-08-06 22:32:55 -06:00
Fabian Montero 6c66eb0e36
switch to sway 2025-08-06 22:31:17 -06:00
Fabian Montero 52e1424f48
add trivionomicon input 2025-08-05 21:59:10 -06:00
Fabian Montero ef8939612e
add sway and xdg config 2025-08-05 21:58:46 -06:00
Fabian Montero 9687235d30
add i3lock to sys config 2025-08-05 20:26:52 -06:00
Fabian Montero 0249e2941b
apply config changes for 25.05 2025-07-27 21:15:13 -06:00
Fabian Montero 2c2fa2b6c1
flake.lock: Update
Flake lock file updates:

• Updated input 'home-manager':
    'github:nix-community/home-manager/d5f1f641b289553927b3801580598d200a501863?narHash=sha256-ypL9WAZfmJr5V70jEVzqGjjQzF0uCkz%2BAFQF7n9NmNc%3D' (2025-05-19)
  → 'github:nix-community/home-manager/fc3add429f21450359369af74c2375cb34a2d204?narHash=sha256-oV695RvbAE4%2BR9pcsT9shmp6zE/%2BIZe6evHWX63f2Qg%3D' (2025-07-27)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/50ab793786d9de88ee30ec4e4c24fb4236fc2674?narHash=sha256-/bVBlRpECLVzjV19t5KMdMFWSwKLtb5RyXdjz3LJT%2Bg%3D' (2025-06-30)
  → 'github:nixos/nixpkgs/3ff0e34b1383648053bba8ed03f201d3466f90c9?narHash=sha256-CdX2Rtvp5I8HGu9swBmYuq%2BILwRxpXdJwlpg8jvN4tU%3D' (2025-07-24)
2025-07-27 20:56:39 -06:00
Fabian Montero 19f637c777
update to 25.05 2025-07-27 20:55:53 -06:00
Fabian Montero 60fa062bc6
flake.lock: Update
Flake lock file updates:

• Updated input 'nur':
    'github:nix-community/NUR/e0759865ed946bed60a4343add96ae6d0b20c114?narHash=sha256-09EfYrpsERWY9MwFk6ihHSb5Pz2CsjNGOaU0PlIyzSo%3D' (2025-07-28)
  → 'github:nix-community/NUR/445dc705bfda4e2c67c19d1f6646609fa4198342?narHash=sha256-dWNJiSUVglc9HPepthYNbOOmqbfYlW/3fxxG3tsE1b0%3D' (2025-07-28)
2025-07-27 20:31:54 -06:00
Fabian Montero d098a49d2c
updated flake.lock 2025-05-09 09:56:13 -06:00
Fabian Montero fccdb255c3
replace deluge with qbittorrent 2025-03-13 14:19:50 -06:00
Fabian Montero 53c2980f38
add mapping software 2025-02-18 09:41:13 -06:00
Fabian Montero bc559154f0
apply format 2025-02-17 15:45:00 -06:00
Fabian Montero d2eb1518c7
vps: add mealie 2025-02-12 19:01:17 -06:00
Fabian Montero 1755bf7d18
add deepState dependencies 2025-02-07 18:53:00 -06:00
Fabian Montero 8ecb978605
update syncthing module 2025-02-07 16:41:07 -06:00
Fabian Montero d26ff604e6
add syncthing 2025-02-07 14:21:59 -06:00
Fabian Montero 95930bc83e
improve firefox module 2025-02-07 13:44:32 -06:00
Fabian Montero 86cf517738
update firefox module 2025-01-31 08:33:02 -06:00
Fabian Montero 7854100358
apply formatter 2025-01-31 08:24:40 -06:00
Fabian Montero d7ea157761
vps: enable forgejo actions 2025-01-28 12:51:49 -06:00
Fabian Montero 48d230a108
improve firefox module 2025-01-28 12:30:06 -06:00
Fabian Montero d7f1c06f40
modularize gui and browsers modules 2025-01-28 12:15:31 -06:00
Fabian Montero 5b194ca54a
add readme 2025-01-27 23:21:05 -06:00
Fabian Montero 62a361c5eb
apply formatter and fix typo 2025-01-27 23:17:54 -06:00
Fabian Montero ae37ebf22a
vps: add wiki-js 2025-01-27 23:17:12 -06:00
Fabian Montero cbda46edd5
modularize steam 2025-01-27 19:52:25 -06:00
Fabian Montero 9f0e9811e3
home: remove zoom 2025-01-27 19:51:38 -06:00
Fabian Montero 4acb6e2408
split theme into its own module and add xdg configuration 2025-01-27 19:01:09 -06:00
Fabian Montero 7f692459a9
add vpn addresses to fail2ban whitelist 2025-01-25 00:15:24 -06:00
Fabian Montero 4a7bda944f
add ipv6 support, net module and wireguard vpn 2025-01-25 00:10:50 -06:00
Fabian Montero 63a190bc7c
vps: change syncthing datadir to vps NAS 2025-01-24 12:00:01 -06:00
Fabian Montero 09a74648a1
vps: reduce immich worker concurrency 2025-01-24 11:59:23 -06:00
46 changed files with 1442 additions and 1726 deletions

17
README.md Normal file
View file

@ -0,0 +1,17 @@
## Screenshots
[Click here](https://old.reddit.com/r/unixporn/comments/1ml7w96/sway_minimalist_rice_on_nixos/)
## Unified nix configuration
Switch server: `nixos-rebuild switch --target-host root@posixlycorrect.com --use-substitutes --show-trace --flake .\#vps`
Switch current machine: `sudo nixos-rebuild switch --flake . --show-trace`
Switch current home manager: `home-manager switch --flake . --show-trace`
Update homepage: `nix flake update --commit-lock-file homepage`
Update whole flake: `nix flake update --commit-lock-file`

1014
flake.lock

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,10 @@
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
unstable.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager = {
url = "github:nix-community/home-manager/release-24.11";
url = "github:nix-community/home-manager/release-25.05";
inputs.nixpkgs.follows = "nixpkgs";
};
@ -17,6 +17,11 @@
homepage.url = "git+https://git.posixlycorrect.com/fabian/homepage.git?ref=master";
trivionomicon = {
url = "git+https://git.posixlycorrect.com/deepState/trivionomicon?ref=master";
inputs.nixpkgs.follows = "nixpkgs";
};
authentik-nix = {
url = "github:nix-community/authentik-nix";
inputs.nixpkgs.follows = "nixpkgs";
@ -40,9 +45,9 @@
flake-utils,
vpsadminos,
homepage,
conduwuit,
mediawikiSkinCitizen,
authentik-nix,
trivionomicon,
}: let
system = "x86_64-linux";
@ -55,6 +60,7 @@
self.overlays.default
nur.overlays.default
nixGL.overlay
trivionomicon.overlays.default
];
};
@ -84,6 +90,10 @@
specialArgs = {
inherit flakes;
doctrine = import "${trivionomicon}/doctrine" {
inherit pkgs;
namespace = "sys";
};
};
};
@ -119,6 +129,10 @@
extraSpecialArgs = {
inherit flakes;
doctrine = import "${trivionomicon}/doctrine" {
inherit pkgs;
namespace = "hm";
};
};
};

View file

@ -8,5 +8,6 @@
with lib; {
imports = [
./modules
flakes.trivionomicon.homeManagerModules.default
];
}

View file

@ -13,17 +13,6 @@ in {
config = mkIf cfg.enable {
xdg = {
enable = true;
mimeApps = {
enable = true;
defaultApplications = {};
};
portal = {
# this shouldnt be on baseline, as servers have no GUI
enable = true;
xdgOpenUsePortal = true;
extraPortals = with pkgs; [xdg-desktop-portal-gtk]; #wtf is this
configPackages = with pkgs; [xdg-desktop-portal-gtk]; #wtf is this
};
};
home = {

View file

@ -1,19 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.apps.browsers;
in {
options.local.apps.browsers = {
enable = mkEnableOption "Browser home settings";
};
config = mkIf cfg.enable {
home.packages = with pkgs; [
chromium
firefox
];
};
}

View file

@ -0,0 +1,17 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.services.deepState;
in {
options.local.services.deepState.enable = mkEnableOption "trivionomicon settings";
config = mkIf cfg.enable {
home.sessionVariables = {
FSOCIETY_TELEGRAM_BACKUP_N = "0";
FSOCIETY_TELEGRAM_BACKUP_LOCATION = "/extern/var/fsociety_backup";
};
};
}

View file

@ -8,13 +8,16 @@
./terminal
./neovim.nix
./baseline.nix
./gaming
./gaming.nix
./yubikey.nix
./browsers.nix
./firefox.nix
./gui
./zsh
./gpg.nix
./defaultDesktopPack.nix
./accounts.nix
./syncthing.nix
./deepState.nix
./mapping.nix
];
}

View file

@ -13,8 +13,9 @@ in {
config = mkIf cfg.enable {
home.packages = with pkgs; [
calibre
chromium
discord
gwenview
kdePackages.gwenview
libreoffice-fresh
mpv
obs-studio
@ -28,7 +29,6 @@ in {
vpsfree-client
vscodium-fhs
zola
zoom-us
];
};
}

45
home/modules/firefox.nix Normal file
View file

@ -0,0 +1,45 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.apps.firefox;
in {
options.local.apps.firefox = {
enable = mkEnableOption "firefox settings";
makeDefaultBrowser = mkOption {
type = types.bool;
default = true;
description = ''
Take a guess
'';
};
};
config = mkIf cfg.enable (mkMerge [
{
programs.firefox.enable = true;
}
(mkIf cfg.makeDefaultBrowser {
xdg = {
mimeApps = {
enable = true;
defaultApplications = {
"text/html" = ["firefox"];
"text/uri-list" = ["firefox"];
"x-scheme-handler/http" = ["firefox"];
"x-scheme-handler/https" = ["firefox"];
"x-scheme-handler/about" = ["firefox"];
"x-scheme-handler/unknown" = ["firefox"];
};
};
};
home.sessionVariables.DEFAULT_BROWSER = "${lib.getExe pkgs.firefox}";
})
]);
}

View file

@ -12,11 +12,6 @@ in {
};
config = mkIf cfg.enable {
home.packages = [
# Steam. todo: move to the steam module later
(pkgs.callPackage ./package.nix {})
pkgs.protonup
pkgs.winetricks
pkgs.protontricks
pkgs.lutris
pkgs.openrct2
pkgs.prismlauncher

View file

@ -1,9 +0,0 @@
{
writeShellScriptBin,
steam-run,
steam,
...
}:
writeShellScriptBin "steam" ''
exec ${steam-run}/bin/steam-run ${steam}/bin/steam -console
''

View file

@ -38,7 +38,7 @@ in {
maxCacheTtl = 3600 * 6;
maxCacheTtlSsh = 3600 * 6;
pinentryPackage = pkgs.pinentry-emacs;
pinentry.package = pkgs.pinentry-emacs;
};
accounts.email.accounts = {

View file

@ -1,32 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.gui;
in {
programs.autorandr = {
profiles."default" = {
fingerprint =
mapAttrs
(monitorId: monitor: monitor.fingerprint)
cfg.monitors;
config =
mapAttrs (
monitorId:
filterAttrs
(k: v:
!elem k [
#list of options to exclude from this list
"fingerprint"
"initialI3Workspace"
"monitorId"
])
)
cfg.monitors;
};
};
}

View file

@ -9,149 +9,62 @@ with lib; let
monitorType = {setName}: (
types.submodule ({name ? null, ...}: {
options = {
monitorId = mkOption {
width = mkOption {
type = types.str;
example = "DP-1";
readOnly = true;
internal = true;
default = "1920";
example = "1920";
};
primary = mkOption {
type = types.bool;
default = false;
description = "is primary monitor";
example = "true";
};
position = mkOption {
height = mkOption {
type = types.str;
example = "0x0";
};
mode = mkOption {
type = types.str;
description = "resolution";
default = "1920x1080";
example = "1920x1080";
default = "1080";
example = "1080";
};
rate = mkOption {
type = types.str;
description = "refresh rate";
example = "143.85";
};
rotate = mkOption {
posX = mkOption {
type = types.str;
default = "normal";
example = "left";
description = "x axis position";
default = "0";
example = "0";
};
fingerprint = mkOption {
posY = mkOption {
type = types.str;
example = "00ffffffffffff003669a03bd4040000231e0104a5341d783bd005ac5048a627125054bfcf00814081809500714f81c0b30001010101023a801871382d40582c450009252100001e0882805070384d400820f80c09252100001a000000fd003090b4b422010a202020202020000000fc004d53492047323443340a20202001a2020320f14d010304131f120211900e0f1d1e230907078301000065030c001000866f80a0703840403020350009252100001a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9";
description = "y axis position";
default = "0";
example = "0";
};
initialI3Workspace = mkOption {
type = types.nullOr types.int;
default = null;
example = 1;
};
};
config = optionalAttrs setName {
# make this better later
monitorId = name;
};
})
);
in {
options.local.gui = {
enable = mkEnableOption "GUI settings";
primaryMonitor = mkOption {
type = monitorType {setName = false;};
readOnly = true;
internal = true;
};
monitors = mkOption {
type = types.attrsOf (monitorType {setName = true;});
};
displayBatteryLevel = mkOption {
type = types.bool;
default = false;
description = "show battery level on polybar";
example = "true";
};
};
imports = [
./autorandr.nix
./fonts.nix
./i3.nix
./polybar.nix
./startx.nix # move to ly once 24.11 comes out :(
./picom.nix
./theme.nix
./sway.nix
./waybar.nix
./mako.nix
];
config = let
primaryMonitors =
filter (monitor: monitor.primary)
(attrValues cfg.monitors);
in
mkIf cfg.enable {
assertions = [
{
assertion = length primaryMonitors == 1;
message = "Exactly one (1) primary monitor is requiered.";
}
];
local.gui.primaryMonitor = head primaryMonitors;
xsession = {
config = mkIf cfg.enable {
xdg = {
enable = true;
windowManager.i3.enable = true;
};
programs.autorandr.enable = true;
services = {
dunst.enable = true;
betterlockscreen.enable = true;
polybar.enable = true;
picom.enable = true;
};
gtk = {
mimeApps = {
enable = true;
iconTheme = {
name = "Papirus-Dark";
package = pkgs.papirus-icon-theme;
};
theme = {
package = pkgs.materia-theme;
name = "Materia-dark";
};
gtk2.extraConfig = ''
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
gtk-menu-images=1
gtk-button-images=1
'';
gtk3.extraConfig = {
gtk-application-prefer-dark-theme = 1;
};
gtk4.extraConfig = {
gtk-application-prefer-dark-theme = 1;
defaultApplications = {
"application/pdf" = with pkgs; ["qpdfview"];
"x-scheme-handler/file" = with pkgs; ["kitty"];
};
};
#qt = { mentioning qt makes qt applications not work, I should probably check how to fix this
# enable = true;
# style.name = "bb10dark";
#};
home.sessionVariables = {
# Use gtk in jvm apps
_JAVA_OPTIONS = concatStringsSep " " [
"-Dawt.useSystemAAFontSettings=on"
"-Dswing.aatext=true"
"-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel"
"-Dswing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel"
];
};
};
}

View file

@ -4,9 +4,38 @@
pkgs,
...
}: {
fonts.fontconfig.enable = true;
fonts.fontconfig = {
enable = true;
defaultFonts = {
monospace = [
"JetBrains Mono"
"Noto Sans Mono CJK SC"
"Noto Sans Mono"
"Noto Color Emoji"
];
sansSerif = [
"Noto Sans"
"Noto Sans CJK SC"
"Noto Color Emoji"
];
serif = [
"Noto Serif"
"Noto Serif CJK SC"
"Noto Color Emoji"
];
emoji = ["Noto Color Emoji"];
};
};
# this is probably not necessary since they are already installed in sys
# with fonts.packages buy im too lazy to check
home.packages = with pkgs; [
jetbrains-mono
noto-fonts
noto-fonts-cjk-sans
noto-fonts-emoji
noto-fonts-extra
nerd-fonts.fira-code
nerd-fonts.droid-sans-mono
];
}

View file

@ -1,108 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib; {
xsession.windowManager.i3 = {
package = pkgs.i3-gaps;
config = let
mod = "Mod4";
in {
modifier = mod;
fonts = {
names = ["JetBrains Mono"];
style = "Regular";
size = 8.0;
};
gaps = {
inner = 10;
outer = -10;
};
window = {
hideEdgeBorders = "both";
titlebar = false;
};
workspaceLayout = "tabbed";
colors = {
focused = {
background = "#222222";
border = "#4c7899";
childBorder = "#222222";
indicator = "#292d2e";
text = "#888888";
};
};
# mkOptionDefault hace que se ponga la config por default
# y se sobreescriba las cosas que pongo acá
# NO QUITARLO. ver man home-configuration.nix
keybindings = mkOptionDefault {
"${mod}+Return" = "exec ${pkgs.kitty}/bin/kitty ${pkgs.tmux}/bin/tmux";
"${mod}+Tab" = "focus right";
"${mod}+Shift+Tab" = "focus left";
"${mod}+Shift+s" = "exec ${pkgs.maim}/bin/maim -s -u | ${pkgs.xclip}/bin/xclip -selection clipboard -t image/png -i";
"${mod}+Shift+w" = "move workspace to output right";
"${mod}+l" = "exec ${pkgs.betterlockscreen}/bin/betterlockscreen -l";
};
startup = [
{
command = "${pkgs.xss-lock}/bin/xss-lock --transfer-sleep-lock -- ${pkgs.i3lock}/bin/i3lock --nofork";
notification = false;
}
{
command = "${pkgs.networkmanagerapplet}/bin/nm-applet";
notification = false;
}
#todo: sería nice hostear esta imagen en el server y fetchearla si no existe
{
command = "${pkgs.feh}/bin/feh --bg-fill ${config.home.homeDirectory}/Pictures/wallpapers/jupiter.png";
notification = false;
always = true;
}
{
#todo: move this to browsers module
command = "${pkgs.i3-gaps}/bin/i3-msg 'workspace 1; exec ${pkgs.firefox}/bin/firefox'";
}
{
#todo: move this to telegram module
command = "${pkgs.i3-gaps}/bin/i3-msg 'workspace 2; exec ${pkgs.tdesktop}/bin/telegram-desktop'";
}
#{
# command = "${pkgs.i3-gaps}/bin/i3-msg 'workspace 2; exec ${pkgs.element-desktop}/bin/element-desktop'";
#}
{
command = "${pkgs.systemd}/bin/systemctl --user restart polybar.service";
notification = false;
always = true;
}
{
command = "${pkgs.autorandr}/bin/autorandr -c";
notification = false;
always = true;
}
];
workspaceOutputAssign =
mapAttrsToList (
monitorId: v:
{
output = monitorId;
}
// optionalAttrs (v.initialI3Workspace != null) {
workspace = toString v.initialI3Workspace;
}
)
config.local.gui.monitors;
bars = [];
};
};
}

28
home/modules/gui/mako.nix Normal file
View file

@ -0,0 +1,28 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.gui;
in {
config = mkIf cfg.enable {
services.mako = {
enable = true;
settings = {
actions = true;
anchor = "top-right";
background-color = "#000000";
border-color = "#000000";
progress-color="over #FFFFFF";
border-radius = 0;
default-timeout = 7000;
font = "JetBrains Mono 10";
icons = true;
ignore-timeout = false;
layer = "top";
};
};
};
}

View file

@ -1,41 +0,0 @@
{
config,
pkgs,
lib,
...
}: {
services.picom = {
fade = true;
fadeSteps = [0.1 0.1];
fadeDelta = 10;
settings = {
animations = [
{
triggers = [
"open"
"show"
];
preset = "appear";
duration = "1";
}
{
triggers = [
"close"
"hide"
];
preset = "disappear";
duration = "1";
}
{
triggers = [
"geometry"
];
preset = "geometry-change";
duration = "1";
}
];
};
};
}

View file

@ -1,460 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib; {
services.polybar = {
package = pkgs.polybarFull;
script = ''
# Terminate already running bar instances
killall -q polybar
# Wait until the processes have been shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done
# Launch Polybar, using default config location ~/.config/polybar/config
polybar -r main & polybar -r secondary &
'';
settings = {
"colors" = {
# background = "\${xrdb:color0:#222}";
background = "#AA000000";
background-alt = "#00000000";
# foreground = "\${xrdb:color7:#222}";
foreground = "#ffffff";
foreground-alt = "#ffffff";
primary = "#ffffff";
secondary = "#e60053";
alert = "#bd2c40";
};
"bar/main" = {
monitor = config.local.gui.primaryMonitor.monitorId;
width = "100%";
height = 30;
offset-x = "0%";
offset-y = "0%";
radius = 0.0;
fixed-center = false;
background = "\${colors.background}";
foreground = "\${colors.foreground}";
line-size = 1;
line-color = "#f0000000";
border-size = 0;
border-color = "#00000000";
padding-left = 0;
padding-right = 0;
module-margin-left = 1;
module-margin-right = 1;
# font-0 = "fixed:pixelsize=10;1";
font-0 = "JetBrains Mono Light:size=10;0";
font-1 = "unifont:fontformat=truetype:size=8:antialias=false;0";
font-2 = "siji:pixelsize=10;1";
# font-2 = "FontAwesome5Free:style=Regular:size=10;4";
modules-left = "i3";
modules-center = "xwindow";
modules-right = "xkeyboard pulseaudio filesystem memory cpu temperature gputemperature nvmetemperature wlan eth date semanatec";
separator = "|";
tray-position = "right";
tray-padding = 2;
# To allow other windows to be placed above the bar, or to avoid having the bar visible when in fullscreen mode,
# you need to use the following two parameters. Note that it will tell the window manager to back off so no
# area will be reserved, etc.
#
# wm-restack = "i3";
# override-redirect = true;
cursor-click = "pointer";
cursor-scroll = "ns-resize";
};
"bar/secondary" = {
monitor = head (attrNames (filterAttrs (monitorId: v:
!v.primary)
config.local.gui.monitors)); # this is bad. will fail if more than 2 monitors. this sets all monitors other than the primary one for this bar.
"inherit" = "bar/main";
modules-left = "i3";
modules-center = "xwindow";
modules-right = "xkeyboard pulseaudio date";
tray-position = "none";
};
"module/xwindow" = {
type = "internal/xwindow";
label = "%title:0:30:...%";
};
"module/xkeyboard" = {
type = "internal/xkeyboard";
blacklist-0 = "num lock";
format-prefix = "";
format-prefix-foreground = "\${colors.foreground-alt}";
label-layout = "%layout%";
label-indicator-padding = 2;
label-indicator-margin = 1;
label-indicator-background = "\${colors.secondary}";
};
"module/filesystem" = {
type = "internal/fs";
interval = 10;
mount-0 = "/";
label-mounted = "%{F#0a81f5}%mountpoint%%{F-}: %used%/%total%";
label-unmounted = "";
};
"module/i3" = {
type = "internal/i3";
format = "<label-state> <label-mode>";
index-sort = true;
wrapping-scroll = false;
# Only show workspaces on the same output as the bar
# pin-workspaces = true
label-mode-padding = 1;
label-mode-foreground = "#000";
label-mode-background = "\${colors.primary}";
# focused = Active workspace on focused monitor
label-focused = "%index%";
label-focused-background = "\${colors.background}";
label-focused-underline = "\${colors.primary}";
label-focused-padding = 1;
# unfocused = Inactive workspace on any monitor
label-unfocused = "%index%";
label-unfocused-padding = 1;
# visible = Active workspace on unfocused monitor
label-visible = "%index%";
label-visible-background = "\${self.label-focused-background}";
label-visible-underline = "\${self.label-focused-underline}";
label-visible-padding = "\${self.label-focused-padding}";
# urgent = Workspace with urgency hint set
label-urgent = "%index%";
label-urgent-background = "\${colors.alert}";
label-urgent-padding = 1;
};
"module/xbacklight" = {
type = "internal/xbacklight";
format = "<label> <bar>";
label = "BL";
bar-width = 10;
bar-indicator = "|";
bar-indicator-foreground = "#fff";
bar-indicator-font = 2;
bar-fill = "";
bar-fill-font = 2;
bar-fill-foreground = "#9f78e1";
bar-empty = "";
bar-empty-font = 2;
bar-empty-foreground = "\${colors.foreground-alt}";
};
"module/backlight-acpi" = {
"inherit" = "module/xbacklight";
type = "internal/backlight";
card = "intel_backlight";
};
"module/cpu" = {
type = "internal/cpu";
interval = 2;
format-prefix = "cpu ";
format-prefix-foreground = "\${colors.foreground-alt}";
label = "%percentage:2%%";
};
"module/memory" = {
type = "internal/memory";
interval = 2;
format-prefix = "mem ";
format-prefix-foreground = "\${colors.foreground-alt}";
label = "%percentage_used%%";
};
"module/wlan" = {
type = "internal/network";
interface = "wlp7s0";
interval = 3.0;
format-connected = "<ramp-signal> <label-connected>";
label-connected = "%essid%";
format-disconnected = "";
# format-disconnected = "<label-disconnected>";
# format-disconnected-underline = "\${self.format-connected-underline}";
# label-disconnected = "%ifname% disconnected";
# label-disconnected-foreground = "\${colors.foreground-alt}";
ramp-signal-0 = "";
ramp-signal-1 = "";
ramp-signal-2 = "";
ramp-signal-3 = "";
ramp-signal-4 = "";
ramp-signal-foreground = "\${colors.foreground-alt}";
};
"module/eth" = {
type = "internal/network";
interface = "enp8s0";
interval = 3.0;
format-connected-prefix = "";
format-connected-prefix-foreground = "\${colors.foreground-alt}";
label-connected = "%local_ip%";
format-disconnected = "";
# format-disconnected = "<label-disconnected>";
# format-disconnected-underline = "\${self.format-connected-underline}";
# label-disconnected = "%ifname% disconnected";
# label-disconnected-foreground = "\${colors.foreground-alt}";
};
"module/date" = {
type = "internal/date";
interval = 1;
date = " %d/%m/%Y";
date-alt = " %c";
time = "%H:%M";
time-alt = " [%s]";
format-prefix = "";
format-prefix-foreground = "\${colors.foreground-alt}";
label = "%date% %time%";
};
# "module/semanatec" = {
# type = "custom/script"
# exec = "/home/fabian/bin/semanatec/target/release/semanatec"
# interval = 3600
# format-prefix = ""
# };
"module/pulseaudio" = {
type = "internal/pulseaudio";
format-volume = "<label-volume>";
label-volume = "vol %percentage%%";
label-volume-foreground = "\${root.foreground}";
label-muted = "vol 0%";
label-muted-foreground = "\${root.foreground}";
bar-volume-width = 10;
bar-volume-foreground-0 = "#55aa55";
bar-volume-foreground-1 = "#55aa55";
bar-volume-foreground-2 = "#55aa55";
bar-volume-foreground-3 = "#55aa55";
bar-volume-foreground-4 = "#55aa55";
bar-volume-foreground-5 = "#f5a70a";
bar-volume-foreground-6 = "#ff5555";
bar-volume-gradient = false;
bar-volume-indicator = "|";
bar-volume-indicator-font = 2;
bar-volume-fill = "";
bar-volume-fill-font = 2;
bar-volume-empty = "";
bar-volume-empty-font = 2;
bar-volume-empty-foreground = "\${colors.foreground-alt}";
};
"module/alsa" = {
type = "internal/alsa";
format-volume = "<label-volume> <bar-volume>";
label-volume = "VOL";
label-volume-foreground = "\${root.foreground}";
format-muted-prefix = "vol ";
format-muted-foreground = "\${colors.foreground-alt}";
label-muted = "sound muted";
bar-volume-width = 10;
bar-volume-foreground-0 = "#55aa55";
bar-volume-foreground-1 = "#55aa55";
bar-volume-foreground-2 = "#55aa55";
bar-volume-foreground-3 = "#55aa55";
bar-volume-foreground-4 = "#55aa55";
bar-volume-foreground-5 = "#f5a70a";
bar-volume-foreground-6 = "#ff5555";
bar-volume-gradient = false;
bar-volume-indicator = "|";
bar-volume-indicator-font = 2;
bar-volume-fill = "";
bar-volume-fill-font = 2;
bar-volume-empty = "";
bar-volume-empty-font = 2;
bar-volume-empty-foreground = "\${colors.foreground-alt}";
};
"module/battery" = {
type = "internal/battery";
battery = "BAT0";
adapter = "ADP1";
full-at = 98;
format-charging = "<animation-charging> <label-charging>";
format-charging-underline = "#ffb52a";
format-discharging = "<animation-discharging> <label-discharging>";
format-discharging-underline = "\${self.format-charging-underline}";
format-full-prefix = " ";
format-full-prefix-foreground = "\${colors.foreground-alt}";
format-full-underline = "\${self.format-charging-underline}";
ramp-capacity-0 = "";
ramp-capacity-1 = "";
ramp-capacity-2 = "";
ramp-capacity-foreground = "\${colors.foreground-alt}";
animation-charging-0 = "";
animation-charging-1 = "";
animation-charging-2 = "";
animation-charging-foreground = "\${colors.foreground-alt}";
animation-charging-framerate = 750;
animation-discharging-0 = "";
animation-discharging-1 = "";
animation-discharging-2 = "";
animation-discharging-foreground = "\${colors.foreground-alt}";
animation-discharging-framerate = 750;
};
"module/temperature" = {
type = "internal/temperature";
warn-temperature = 60;
hwmon-path = "/sys/devices/pci0000:00/0000:00:18.3/hwmon/hwmon1/temp2_input";
format = "<ramp> <label>";
format-warn = "<ramp> <label-warn>";
label = "cpu %temperature-c%";
label-warn = "cpu %temperature-c%";
label-warn-foreground = "\${colors.secondary}";
ramp-0 = "";
ramp-1 = "";
ramp-2 = "";
ramp-foreground = "\${colors.foreground-alt}";
};
"module/gputemperature" = {
type = "internal/temperature";
warn-temperature = 60;
hwmon-path = "/sys/devices/pci0000:00/0000:00:03.1/0000:09:00.0/hwmon/hwmon3/temp1_input";
format = "<ramp> <label>";
format-warn = "<ramp> <label-warn>";
label = "gpu %temperature-c%";
label-warn = "gpu %temperature-c%";
label-warn-foreground = "\${colors.secondary}";
ramp-0 = "";
ramp-1 = "";
ramp-2 = "";
ramp-foreground = "\${colors.foreground-alt}";
};
"module/nvmetemperature" = {
type = "internal/temperature";
warn-temperature = 60;
hwmon-path = "/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/hwmon/hwmon0/temp1_input";
format = "<ramp> <label>";
format-warn = "<ramp> <label-warn>";
label = "M.2 %temperature-c%";
label-warn = "M.2 %temperature-c%";
label-warn-foreground = "\${colors.secondary}";
ramp-0 = "";
ramp-1 = "";
ramp-2 = "";
ramp-foreground = "\${colors.foreground-alt}";
};
"module/powermenu" = {
type = "custom/menu";
expand-right = true;
format-spacing = 1;
label-open = "";
label-open-foreground = "\${colors.secondary}";
label-close = " cancel";
label-close-foreground = "\${colors.secondary}";
label-separator = "|";
label-separator-foreground = "\${colors.foreground-alt}";
menu-0-0 = "reboot";
menu-0-0-exec = "menu-open-1";
menu-0-1 = "power off";
menu-0-1-exec = "menu-open-2";
menu-1-0 = "cancel";
menu-1-0-exec = "menu-open-0";
menu-1-1 = "reboot";
menu-1-1-exec = "sudo reboot";
menu-2-0 = "power off";
menu-2-0-exec = "sudo poweroff";
menu-2-1 = "cancel";
menu-2-1-exec = "menu-open-0";
};
"module/sink_changer" = {
type = "custom/script";
exec = "/home/fabian/bin/polybar_scripts/info.sh";
label = "%output%";
click-left = "/home/fabian/bin/polybar_scripts/sink_changer.sh";
# format-prefix = " ";
interval = "0";
# format-prefix-foreground = "${colors.foreground-alt}";
};
"settings" = {
screenchange-reload = true;
# compositing-background = "xor";
# compositing-background = "screen";
# compositing-foreground = "source";
# compositing-border = "over";
# pseudo-transparency = false;
};
"global/wm" = {
margin-top = 5;
margin-bottom = 5;
};
};
};
}

View file

@ -1,16 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib; {
config = mkIf config.local.gui.enable {
home.file.".xinitrc".source = let
content = ''
exec ~/.xsession
'';
in
pkgs.writeShellScript "xinitrc" content;
};
}

189
home/modules/gui/sway.nix Normal file
View file

@ -0,0 +1,189 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.gui;
in {
config = mkIf cfg.enable {
home.packages = with pkgs; [
wlr-randr
bemenu
];
home.sessionVariables = {
"BEMENU_BACKEND" = "wayland";
};
services = {
swayidle = {
enable = true;
timeouts = [
{
timeout = 600;
command = "${getExe pkgs.gtklock} -d";
}
];
};
};
systemd.user.services.wl-gammarelay-rs = {
Unit.After = ["sway-session.target"];
Install.WantedBy = ["sway-session.target"];
Service.ExecStart = getExe pkgs.wl-gammarelay-rs;
};
wayland.windowManager.sway = {
enable = true;
config = {
output =
lib.mapAttrs (k: v: {
mode = "${toString v.width}x${toString v.height}@${v.rate}Hz";
pos = "${toString v.posX} ${toString v.posY}";
})
cfg.monitors;
modifier = "Mod4";
focus = {
followMouse = true;
wrapping = "workspace";
};
input = {
"*" = {
xkb_layout = "us";
xkb_variant = "altgr-intl";
};
};
fonts = {
names = ["JetBrains Mono"];
style = "Regular";
size = 8.0;
};
gaps = {
inner = 8;
outer = -10;
smartBorders = "on";
smartGaps = true;
};
bars = singleton {
command = "waybar";
position = "top";
};
window = {
hideEdgeBorders = "both";
titlebar = false;
border = 2;
};
floating = {
border = 0;
titlebar = false;
};
menu = "bemenu-run";
workspaceLayout = "tabbed";
colors = {
background = "#141414";
focused = {
border = "#1c1c1c";
background = "#000000";
text = "#eaeaea";
indicator = "#000000";
childBorder = "#000000";
};
focusedInactive = {
border = "#000000";
background = "#000000";
text = "#eaeaea";
indicator = "#000000";
childBorder = "#000000";
};
unfocused = {
border = "#000000";
background = "#000000";
text = "#eaeaea";
indicator = "#000000";
childBorder = "#000000";
};
urgent = {
border = "#ff6666";
background = "#ff6666";
text = "#eaeaea";
indicator = "#ff6666";
childBorder = "#ff6666";
};
placeholder = {
border = "#000000";
background = "#000000";
text = "#eaeaea";
indicator = "#000000";
childBorder = "#000000";
};
};
keybindings = let
mod = config.wayland.windowManager.sway.config.modifier;
grimshot = getExe pkgs.sway-contrib.grimshot;
bemenuCommand = ''bemenu-run --center --width-factor 0.2 --fixed-height --list 10 --scrollbar none --auto-select --accept-single --fn "JetBrains Mono 12" --prompt "" --tb "#000000" --tf "#EAEAEA" --fb "#000000" --ff "#EAEAEA" --cb "#EAEAEA" --cf "#000000" --nb "#000000" --nf "#EAEAEA" --sb "#000000" --sf "#EAEAEA" --hb "#000000" --hf "#EAEAEA" --fbb "#000000" --fbf "#000000" --ab "#000000" --af "#EAEAEA"'';
in
mkOptionDefault {
"${mod}+a" = "focus parent";
"${mod}+c" = "focus child";
"${mod}+d" = "exec ${bemenuCommand}";
"${mod}+l" = "exec ${getExe pkgs.gtklock} -d";
"${mod}+Return" = "exec ${lib.getExe pkgs.kitty} ${lib.getExe pkgs.tmux}";
"${mod}+Shift+s" = "exec ${grimshot} copy area";
"${mod}+Shift+a" = "exec ${grimshot} copy output";
"${mod}+Tab" = "focus right";
"${mod}+Shift+Tab" = "focus left";
"${mod}+Shift+w" = "move workspace to output right";
};
startup = [
{
command = "${lib.getExe pkgs.sway} 'workspace 1; exec ${lib.getExe pkgs.firefox}'";
}
{
command = "${lib.getExe pkgs.sway} 'workspace 2; exec ${lib.getExe pkgs.tdesktop}'";
}
{
command = "${lib.getExe pkgs.sway} 'workspace 2; exec ${lib.getExe pkgs.gajim}'";
}
{
command = "${lib.getExe pkgs.swaybg} -m fill -i ${config.home.homeDirectory}/Pictures/wallpapers/jupiter.png";
always = true;
}
{
command = "${lib.getExe pkgs.networkmanagerapplet}";
}
];
};
extraSessionCommands = ''
export SDL_VIDEODRIVER=wayland
# needs qt5.qtwayland in systemPackages
export QT_QPA_PLATFORM=wayland
export QT_WAYLAND_DISABLE_WINDOWDECORATION="1"
# Fix for some Java AWT applications (e.g. Android Studio),
# use this if they aren't displayed properly:
export _JAVA_AWT_WM_NONREPARENTING=1
'';
swaynag.enable = true;
systemd.enable = true;
xwayland = true;
};
};
}

View file

@ -0,0 +1,43 @@
{
config,
lib,
pkgs,
...
}:
with lib; {
gtk = {
enable = true;
iconTheme = {
name = "Papirus-Dark";
package = pkgs.papirus-icon-theme;
};
theme = {
package = pkgs.materia-theme;
name = "Materia-dark";
};
gtk2.extraConfig = ''
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
gtk-menu-images=1
gtk-button-images=1
'';
gtk3.extraConfig = {
gtk-application-prefer-dark-theme = 1;
};
gtk4.extraConfig = {
gtk-application-prefer-dark-theme = 1;
};
};
home.sessionVariables = {
# Use gtk in jvm apps
_JAVA_OPTIONS = concatStringsSep " " [
"-Dawt.useSystemAAFontSettings=on"
"-Dswing.aatext=true"
"-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel"
"-Dswing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel"
];
};
}

182
home/modules/gui/waybar.nix Normal file
View file

@ -0,0 +1,182 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.gui;
in {
config = mkIf cfg.enable {
programs.waybar = {
enable = true;
settings = {
mainBar = {
layer = "top";
position = "top";
height = 20;
spacing = 0;
modules-left = [
"sway/workspaces"
"sway/mode"
];
modules-center = [
"clock"
];
modules-right = [
"privacy"
"cpu"
"memory"
"disk"
"temperature"
"keyboard-state"
"tray"
];
"keyboard-state" = {
numlock = true;
capslock = true;
};
"tray" = {
icon-size = 13;
spacing = 8;
};
"clock" = {
interval = 60;
format = "{:%A %B %d %Y %H:%M}";
tooltip = false;
};
"cpu" = {
format = "cpu {usage}%";
tooltip = false;
};
"memory" = {
format = "mem {percentage}%";
tooltip = true;
tooltip-format = "{used}/{total}";
};
"disk" = {
format = "disk {specific_used:0.0f}/{specific_total:0.0f}";
unit = "GiB";
tooltip = false;
};
"privacy" = {
icon-size = 12;
};
};
};
style = ''
* {
font-family: "JetBrains Mono", monospace;
font-size: 12px;
font-weight: 500;
border: none;
box-shadow: none;
}
/* Entire bar: fully transparent, no border */
window#waybar {
background: transparent;
color: #eaeaea;
margin: 0;
padding: 0;
}
/* Optional: small edge breathing room (comment out if you want edge-to-edge) */
/* window#waybar { margin: 3px 6px 0 6px; } */
/* Module containers */
.modules-left, .modules-center, .modules-right {
padding: 0;
margin: 0 6px;
}
/* Subtle separators between modules (no boxes) */
.modules-left > widget:not(:first-child),
.modules-center > widget:not(:first-child),
.modules-right > widget:not(:first-child) {
margin-left: 12px;
padding-left: 12px;
border-left: 1px solid rgba(255, 255, 255, 0.08);
}
/* Tightest possible workspaces */
#workspaces { padding: 0; margin: 0; }
#workspaces button {
margin: 0;
padding: 0 3px;
min-width: 0;
border-radius: 0;
background: transparent;
color: #cfcfcf;
}
#workspaces button:hover {
background: rgba(255, 255, 255, 0.06);
}
#workspaces button.active,
#workspaces button.focused {
background: rgba(255, 255, 255, 0.10);
color: #ffffff;
border-bottom: 2px solid #ffffff;
}
#workspaces button.urgent {
background: rgba(255, 80, 80, 0.25);
border-bottom: 2px solid #ff5050;
}
/* Focused window title: single line, no glow */
#window {
padding: 0 6px;
margin: 0;
color: #dedede;
}
/* Sway mode indicator: visible only when active, no bloat */
#mode {
padding: 0 6px;
margin: 0;
background: rgba(255, 255, 255, 0.10);
color: #ffffff;
border-bottom: 2px solid #ffffff;
}
/* Status modules keep them flat and compact */
#clock, #battery, #network, #pulseaudio, #backlight, #cpu, #memory, #temperature, #tray {
padding: 0 6px;
margin: 0;
background: transparent;
color: #eaeaea;
}
/* States (battery, network, audio) */
#battery.charging { color: #c9ffbf; }
#battery.warning:not(.charging) { color: #ffd29a; }
#battery.critical:not(.charging) { color: #ff9a9a; }
#network.disconnected { color: #ffb4b4; }
#pulseaudio.muted { color: #9aa0a6; }
/* Tray: compress icons */
#tray > .passive { opacity: 0.6; }
#tray > .needs-attention { opacity: 1; }
/* Tooltips: clean and readable */
tooltip {
background: rgba(30, 30, 30, 0.95);
border: 1px solid rgba(255, 255, 255, 0.08);
color: #eaeaea;
padding: 6px 8px;
}
/* Remove any leftover borders around everything */
#custom-*, #idle_inhibitor, #privacy, #bluetooth {
border: none;
background: transparent;
margin: 0;
padding: 0 6px;
}
'';
};
};
}

19
home/modules/mapping.nix Normal file
View file

@ -0,0 +1,19 @@
{
pkgs,
lib,
config,
...
}:
with lib; let
cfg = config.local.apps.mapping;
in {
options.local.apps.mapping = {
enable = mkEnableOption "mapping apps";
};
config = mkIf cfg.enable {
home.packages = with pkgs; [
qgis
openorienteering-mapper
];
};
}

View file

@ -0,0 +1,20 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.services.syncthing;
in {
options.local.services.syncthing = {
enable = mkEnableOption "syncthing settings";
};
config = mkIf cfg.enable {
services.syncthing = {
enable = true;
tray.enable = true;
};
};
}

View file

@ -22,14 +22,27 @@ in {
escapeTime = 10;
terminal = "xterm-256color";
keyMode = "emacs";
mouse = true;
extraConfig = ''
set -g mouse on
set -ga update-environment " LIFT_PID"
set -g set-titles on
set -g renumber-windows on
set -sa terminal-overrides ',xterm-termite:RGB'
set -g status-right "#{?window_bigger,[#{window_offset_x}#,#{window_offset_y}] ,} %H:%M %d-%b-%y"
set -g status-style bg=default,fg=colour250
set -g pane-border-style fg=colour236
set -g pane-active-border-style fg=colour240
set -g window-status-format " #I:#W "
set -g window-status-style bg=default,fg=colour244
set -g window-status-current-format " #I:#W "
set -g window-status-current-style bg=colour236,fg=white,bold
set -g status-position bottom
set -g status-left-length 20
set -g status-right-length 60
set -g status-left ""
set -g window-status-separator ""
set -g status-justify left
'';
};
};

View file

@ -28,7 +28,7 @@ in {
ignoreSpace = true;
};
initExtra = import ./zshrc.nix {inherit config lib pkgs;};
initContent = import ./zshrc.nix {inherit config lib pkgs;};
};
};
}

View file

@ -29,10 +29,12 @@
prompt = "%B[%~] \${vcs_info_msg_0_}%b";
};
accounts.enable = true;
deepState.enable = true;
gpg = {
enable = true;
defaultKey = "7AA277E604A4173916BBB4E91FFAC35E1798174F";
};
syncthing.enable = true;
};
apps = {
@ -40,27 +42,24 @@
neovim.enable = true;
gaming.enable = true;
yubikey.enable = true;
browsers.enable = true;
defaultDesktopPack.enable = true;
firefox.enable = true;
mapping.enable = true;
};
gui = {
enable = true;
monitors = {
DP-1 = {
primary = true;
position = "0x0";
mode = "1920x1080";
rate = "143.85";
fingerprint = "00ffffffffffff003669a03bd4040000231e0104a5341d783bd005ac5048a627125054bfcf00814081809500714f81c0b30001010101023a801871382d40582c450009252100001e0882805070384d400820f80c09252100001a000000fd003090b4b422010a202020202020000000fc004d53492047323443340a20202001a2020320f14d010304131f120211900e0f1d1e230907078301000065030c001000866f80a0703840403020350009252100001a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9";
initialI3Workspace = 1;
width = "1920";
height = "1080";
rate = "59.94";
};
DP-2 = {
position = "1920x0";
mode = "1920x1080";
rate = "59.94";
fingerprint = "00ffffffffffff0009d1e77845540000061f0104a5351e783a0565a756529c270f5054a56b80d1c0b300a9c08180810081c001010101023a801871382d40582c45000f282100001e000000ff0039324d30303033323031510a20000000fd00324c1e5311010a202020202020000000fc0042656e51204757323438300a20019b02031cf14f901f041303120211011406071516052309070783010000023a801871382d40582c45000f282100001f011d8018711c1620582c25000f282100009f011d007251d01e206e2855000f282100001e8c0ad08a20e02d10103e96000f28210000180000000000000000000000000000000000000000000000000000008d";
initialI3Workspace = 10;
width = "1920";
height = "1080";
rate = "143.855";
posX = "1920";
};
};
};
@ -69,18 +68,17 @@
home = {
packages = with pkgs; [
darktable
deluge
(gajim.override {
enableSecrets = true;
# enableJingle = true;
# enableSpelling = true;
enableUPnP = true;
# enableAppIndicator = true;
enableAppIndicator = true;
enableE2E = true;
enableRST = true;
})
gnucash
kdenlive
kdePackages.kdenlive
nmap
qbittorrent
virt-manager
];

View file

@ -48,12 +48,9 @@
enable = true;
monitors = {
eDP-1 = {
primary = true;
position = "0x0";
mode = "1920x1080";
width = "1920";
height = "1080";
rate = "60.00";
fingerprint = "00ffffffffffff000dae0a1400000000291d0104a51f11780328659759548e271e505400000001010101010101010101010101010101363680a0703820403020a60035ad10000018000000fe004e3134304843412d4541450a20000000fe00434d4e0a202020202020202020000000fe004e3134304843412d4541450a200002";
initialI3Workspace = 1;
};
};
};

View file

@ -8,5 +8,4 @@ with lib;
"steam-original"
"steam-unwrapped"
"steam-run"
"zoom"
]

View file

@ -7,6 +7,7 @@
}:
with lib; {
imports = [
flakes.trivionomicon.nixosModules.default
./modules
];
}

View file

@ -13,5 +13,18 @@
./android.nix
./users.nix
./bluetooth.nix
./net.nix
./steam.nix
./gtklock.nix
];
fonts.packages = with pkgs; [
jetbrains-mono
noto-fonts
noto-fonts-cjk-sans
noto-fonts-emoji
noto-fonts-extra
nerd-fonts.fira-code
nerd-fonts.droid-sans-mono
];
}

84
sys/modules/gtklock.nix Normal file
View file

@ -0,0 +1,84 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.sys.gtklock;
in {
options.local.sys.gtklock = {
enable = mkEnableOption "gtklock settings";
};
config = mkIf cfg.enable {
programs.gtklock = {
enable = true;
config = {
main = {
idle-hide = true;
idle-timeout = 1;
time-format = "%H:%M:%S";
start-hidden = true;
};
};
style = ''
/* Main lockscreen window */
window {
background-color: black;
color: #eaeaea;
font-family: "JetBrains Mono", monospace;
font-size: 14px;
}
/* Container for clock + prompt */
#main-box {
background: black;
border: none;
border-radius: 0;
padding: 0;
margin: 0;
}
/* Clock text */
#clock {
font-size: 32px;
font-weight: bold;
color: #ffffff;
margin-bottom: 12px;
}
/* Date text */
#date {
font-size: 14px;
color: #aaaaaa;
margin-bottom: 24px;
}
/* Password entry */
entry {
background-color: black;
color: #ffffff;
border: none;
border-radius: 0;
padding: 6px 8px;
font-family: "JetBrains Mono", monospace;
font-size: 12px;
}
/* Hide any extra icons in the entry */
entry image {
opacity: 0;
width: 0;
height: 0;
}
/* Wrong password feedback */
#auth-failure {
color: #ff6666;
font-size: 12px;
margin-top: 6px;
}
'';
};
};
}

186
sys/modules/net.nix Normal file
View file

@ -0,0 +1,186 @@
{
config,
lib,
...
}:
with lib; {
options.local.sys.nets = with lib.types;
mkOption {
readOnly = true;
type = attrsOf (submodule ({config, ...}: {
options = let
v4config = config.v4;
v6config = config.v6;
in {
hosts = mkOption {
default = {};
type = attrsOf (submodule {
options = {
v4 = mkOption {
default = null;
type = nullOr (submodule ({config, ...}: {
options = {
suffix = mkOption {
type = str;
};
address = mkOption {
type = str;
readOnly = true;
};
cidr = mkOption {
type = str;
readOnly = true;
};
single = mkOption {
type = str;
readOnly = true;
};
};
config = {
address =
if v4config.bits == 0
then config.suffix
else if v4config.bits == 32
then v4config.subnet
else "${v4config.prefix}.${config.suffix}";
cidr = "${config.address}/${toString v4config.bits}";
single = "${config.address}/32";
};
}));
};
v6 = mkOption {
default = null;
type = nullOr (submodule ({config, ...}: {
options = {
suffix = mkOption {
type = str;
};
address = mkOption {
type = str;
readOnly = true;
};
cidr = mkOption {
type = str;
readOnly = true;
};
single = mkOption {
type = str;
readOnly = true;
};
};
config = {
address = let
hextets = fragment: length (splitString ":" fragment);
separator =
if doubleColon
then "::"
else ":";
doubleColon = hextets v6config.prefix + hextets config.suffix < 8;
joined =
if v6config.bits == 128
then v6config.prefix
else if v6config.bits == 0
then config.suffix
else "${v6config.prefix}${separator}${config.suffix}";
in
joined;
cidr = "${config.address}/${toString v6config.bits}";
single = "${config.address}/128";
};
}));
};
};
});
};
v4 = mkOption {
default = null;
type = nullOr (submodule ({config, ...}: {
options = {
bits = mkOption {
type = enum [0 8 16 24 32];
};
prefix = mkOption {
type = str;
};
subnet = mkOption {
type = str;
readOnly = true;
};
cidr = mkOption {
type = str;
readOnly = true;
};
};
config = {
cidr = "${config.subnet}/${toString config.bits}";
subnet =
if config.bits != 0
then config.prefix + strings.replicate (4 - config.bits / 8) ".0"
else "0.0.0.0";
};
}));
};
v6 = mkOption {
default = null;
type = nullOr (submodule ({config, ...}: {
options = {
bits = mkOption {
type =
addCheck (ints.between 0 128) (b: mod b 4 == 0)
// {
description = "IPv6 subnet bits at nibble boundary";
};
};
prefix = mkOption {
type = str;
};
subnet = mkOption {
type = str;
readOnly = true;
};
cidr = mkOption {
type = str;
readOnly = true;
};
};
config = {
cidr = "${config.subnet}/${toString config.bits}";
subnet =
if config.bits == 128 || length (splitString "::" config.prefix) > 1
then config.prefix
else "${config.prefix}::";
};
}));
};
};
}));
};
}

30
sys/modules/steam.nix Normal file
View file

@ -0,0 +1,30 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.local.sys.steam;
in {
options.local.sys.steam = {
enable = mkEnableOption "steam settings";
};
config = mkIf cfg.enable {
programs.steam = {
enable = true;
remotePlay.openFirewall = true;
dedicatedServer.openFirewall = true;
localNetworkGameTransfers.openFirewall = true;
};
environment = {
systemPackages = with pkgs; [
protontricks
protonup
protonup-ng
winetricks
];
};
};
}

View file

@ -19,6 +19,8 @@
graphics.enable = true;
virtualisation.enable = true;
androidSupport.enable = true;
steam.enable = true;
gtklock.enable = true;
users = {
fabian = {
@ -29,6 +31,8 @@
};
};
trivium.sway.enable = true;
networking = {
hostName = "posixlycorrect";
networkmanager.enable = true;

View file

@ -13,6 +13,7 @@ with lib; {
flakes.impermanence.nixosModule
./hardware-configuration.nix
./srv
./networkMap.nix
];
local.sys = {
@ -50,9 +51,67 @@ with lib; {
};
};
systemd.extraConfig = ''
networking.firewall.allowedUDPPorts = [51820]; #TODO
systemd = {
extraConfig = ''
DefaultTimeoutStartSec=900s
'';
network = let
inherit (config.local.sys) nets;
in {
enable = true;
netdevs = {
wg-vpn = {
netdevConfig = {
Name = "wg-vpn";
Kind = "wireguard";
};
wireguardConfig = {
PrivateKeyFile = "/var/trust/wg/vpn/key.priv";
ListenPort = "51820";
};
wireguardPeers = [
{
PublicKey = "wwUp3Uu/rSxbp+6J745O+cpnZHGWOJYWfWEsTjRE3yU=";
PresharedKeyFile = "/var/trust/wg/vpn/vps-posixlycorrect.psk";
AllowedIPs = ["${nets.vpn-posixlycorrect.v6.cidr}"];
}
{
PublicKey = "YFqg/ED26KygSRSmGzvUXpwnXPqMOI3R3caVfAtHVks=";
PresharedKeyFile = "/var/trust/wg/vpn/vps-pixel8.psk";
AllowedIPs = ["${nets.vpn-pixel8.v6.cidr}"];
}
];
};
};
networks = {
wg-vpn = {
name = "wg-vpn";
networkConfig = {
Address = [
nets.vpn-vps.hosts.vps.v6.cidr
];
};
routes = [
{
Destination = nets.vpn.v6.cidr;
}
{
Source = nets.vpn.v6.cidr;
}
];
};
};
};
};
time.timeZone = "Europe/Amsterdam";
}

View file

@ -0,0 +1,78 @@
{
config,
pkgs,
lib,
flakes,
...
}:
with lib; {
local.sys.nets = {
default = {
v4 = {
bits = 32;
prefix = "37.205.12.34";
};
v6 = {
bits = 64;
prefix = "2a03:3b40:fe:102";
};
hosts = {
vps.v6.suffix = "1";
vps.v4.suffix = "";
};
};
vpn = {
v6 = {
bits = 48;
prefix = "2a03:3b40:2b";
};
};
vpn-vps = {
v6 = {
bits = 64;
prefix = "2a03:3b40:2b:1000";
};
hosts = {
vps.v6.suffix = "1";
};
};
vpn-posixlycorrect = {
v6 = {
bits = 64;
prefix = "2a03:3b40:2b:1001";
};
hosts = {
posixlycorrect.v6.suffix = "1";
};
};
vpn-pixel8 = {
v6 = {
bits = 64;
prefix = "2a03:3b40:2b:1002";
};
hosts = {
pixel8.v6.suffix = "1";
};
};
vpn-t14 = {
v6 = {
bits = 64;
prefix = "2a03:3b40:2b:1003";
};
hosts = {
t14.v6.suffix = "1";
};
};
};
}

View file

@ -18,5 +18,7 @@ with lib; {
./shiori.nix
./calibre-web.nix
./immich.nix
./wiki-js.nix
./mealie.nix
];
}

View file

@ -47,12 +47,10 @@ with lib; {
LANDING_PAGE = "explore";
};
# You can temporarily allow registration to create an admin user.
service.DISABLE_REGISTRATION = true;
# ver https://github.com/nektos/act
actions = {
ENABLED = false;
ENABLED = true;
};
mailer = {
ENABLED = false;

View file

@ -28,6 +28,46 @@ with lib; {
environment = {
IMMICH_TELEMETRY_EXCLUDE = "host,api,io,repo,job";
};
settings = {
machineLearning = {
enabled = false;
};
job = {
backgroundTask = {
concurrency = 1;
};
smartSearch = {
concurrency = 1;
};
metadataExtraction = {
concurrency = 1;
};
faceDetection = {
concurrency = 1;
};
search = {
concurrency = 1;
};
sidecar = {
concurrency = 1;
};
library = {
concurrency = 1;
};
migration = {
concurrency = 1;
};
thumbnailGeneration = {
concurrency = 1;
};
videoConversion = {
concurrency = 1;
};
notifications = {
concurrency = 1;
};
};
};
};
};
}

View file

@ -0,0 +1,37 @@
{
lib,
pkgs,
...
}:
with lib; {
systemd.services.wiki-js = {
requires = ["postgresql.service"];
after = ["postgresql.service"];
};
services = {
nginx = {
virtualHosts."food.posixlycorrect.com" = {
enableACME = true;
forceSSL = true;
extraConfig = ''
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
'';
locations."/" = {
proxyPass = "http://127.0.0.1:9000";
};
};
};
mealie = {
enable = true;
listenAddress = "127.0.0.1";
port = 9000;
credentialsFile = "/var/trust/mealie/credentials.env";
settings = {
ALLOW_SIGNUP = "false";
};
};
};
}

View file

@ -1,11 +1,14 @@
{
config,
lib,
pkgs,
...
}:
with lib; {
with lib; let
inherit (config.local.sys) nets;
in {
networking = {
nftables.enable = true;
nftables.enable = false; # learn how to use this later
firewall = {
enable = true;
allowedTCPPorts = [80 443];
@ -49,10 +52,15 @@ with lib; {
};
};
};
fail2ban = {
enable = true;
bantime = "10m";
ignoreIP = ["37.205.12.34"]; # Never ban the server's own IP
ignoreIP = [
nets.default.hosts.vps.v6.cidr
nets.default.hosts.vps.v4.address
nets.vpn.v6.cidr
];
bantime-increment = {
enable = true;
formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)";

View file

@ -13,6 +13,7 @@ with lib; {
openDefaultPorts = true;
guiAddress = "127.0.0.1:8384";
settings.options.urAccepted = -1;
dataDir = "/mnt/export2179/syncthing";
relay = {
enable = true;
pools = [];
@ -20,4 +21,22 @@ with lib; {
};
};
};
# calibre web stuff. make this better someday, this is pure duct-tape
users.groups."calybresync".members = ["syncthing" "calibre-web"];
systemd = {
services."calybreown" = {
script = ''
chgrp -R calybresync /var/lib/calibre-web/calibre_library
chmod -R g+w /var/lib/calibre-web/calibre_library
'';
serviceConfig.Type = "oneshot";
};
timers."calybreown" = {
wantedBy = [
"timers.target"
];
timerConfig.OnCalendar = "*-*-* *:00/30:00";
};
};
}

View file

@ -0,0 +1,53 @@
{
lib,
pkgs,
...
}:
with lib; {
systemd.services.wiki-js = {
requires = ["postgresql.service"];
after = ["postgresql.service"];
};
services = {
nginx = {
virtualHosts."wjs.posixlycorrect.com" = {
enableACME = true;
forceSSL = true;
extraConfig = ''
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
'';
locations."/" = {
proxyPass = "http://127.0.0.1:3000";
};
};
};
wiki-js = {
enable = true;
environmentFile = "/var/trust/wiki-js/env.txt";
settings = {
bindIP = "127.0.0.1";
port = 3000;
db = {
db = "wiki-js";
user = "wiki-js";
type = "postgres";
host = "/run/postgresql";
};
};
};
postgresql = {
enable = true;
ensureDatabases = ["wiki-js"];
ensureUsers = [
{
name = "wiki-js";
ensureDBOwnership = true;
}
];
};
};
}