refactor: cleaned up nixos dir

This commit is contained in:
Nick 2025-02-05 20:15:36 -06:00
parent 89814be57c
commit 2000adb56a
77 changed files with 422 additions and 464 deletions

View file

@ -75,11 +75,9 @@
./profiles/user0 ./profiles/user0
./profiles/user1 ./profiles/user1
config.nixosModules.desktop config.nixosModules.desktop
config.nixosModules.hyprland config.nixosModules.core
config.nixosModules.wayland
config.nixosModules.personal
config.nixosModules.shared
config.nixosModules.sops config.nixosModules.sops
config.nixosModules.system
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
inputs.lix-module.nixosModules.default inputs.lix-module.nixosModules.default
inputs.nur.modules.nixos.default inputs.nur.modules.nixos.default
@ -89,10 +87,9 @@
./systems/fallaryn ./systems/fallaryn
./profiles/user2 ./profiles/user2
config.nixosModules.fallaryn config.nixosModules.fallaryn
config.nixosModules.personal config.nixosModules.core
config.nixosModules.plasma
config.nixosModules.shared
config.nixosModules.sops config.nixosModules.sops
config.nixosModules.system
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
inputs.lix-module.nixosModules.default inputs.lix-module.nixosModules.default
inputs.sops-nix.nixosModules.sops inputs.sops-nix.nixosModules.sops
@ -101,9 +98,10 @@
./systems/laptop ./systems/laptop
./profiles/user0 ./profiles/user0
./profiles/user1 ./profiles/user1
config.nixosModules.personal config.nixosModules.laptop
config.nixosModules.shared config.nixosModules.core
config.nixosModules.sops config.nixosModules.sops
config.nixosModules.system
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
inputs.lix-module.nixosModules.default inputs.lix-module.nixosModules.default
inputs.nur.modules.nixos.default inputs.nur.modules.nixos.default
@ -112,9 +110,9 @@
bartholomew = inputs.self.lib.mkLinuxSystem [ bartholomew = inputs.self.lib.mkLinuxSystem [
./systems/bartholomew ./systems/bartholomew
./profiles/user1 ./profiles/user1
config.nixosModules.gnome config.nixosModules.laptop
config.nixosModules.personal config.nixosModules.core
config.nixosModules.shared config.nixosModules.system
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
inputs.lix-module.nixosModules.default inputs.lix-module.nixosModules.default
]; ];
@ -122,8 +120,9 @@
./systems/server ./systems/server
./profiles/user0 ./profiles/user0
config.nixosModules.server config.nixosModules.server
config.nixosModules.shared config.nixosModules.core
config.nixosModules.sops config.nixosModules.sops
config.nixosModules.system
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
inputs.lix-module.nixosModules.default inputs.lix-module.nixosModules.default
inputs.ngipkgs.nixosModules."services.peertube" inputs.ngipkgs.nixosModules."services.peertube"

148
nixos/default.nix Executable file → Normal file
View file

@ -1,66 +1,38 @@
let let
modulesPath = ./modules; collectDirs =
moduleImport = path:
path: nameTransform: let
builtins.listToAttrs ( content = builtins.readDir path;
map subdirs = builtins.filter (name: content.${name} == "directory") (builtins.attrNames content);
(name: { buildPath = name: path + "/${name}";
name = nameTransform name;
value = import (path + "/${name}"); thisDirs = map buildPath subdirs;
}) subDirs = builtins.concatMap collectDirs thisDirs;
( in
builtins.filter ( [ path ] ++ subDirs;
name: (builtins.readDir path).${name} == "regular" && builtins.match ".*\\.nix$" name != null
) (builtins.attrNames (builtins.readDir path)) directoryImport =
)
);
modules =
moduleImport modulesPath (name: builtins.replaceStrings [ ".nix" ] [ "" ] name)
// (
path: path:
builtins.listToAttrs ( builtins.listToAttrs (
map map (dir: {
(name: { name = baseNameOf (toString dir);
name = name; value = import dir;
value = import (path + "/${name}"); }) (collectDirs path)
}) );
(
builtins.filter (name: (builtins.readDir path).${name} == "directory") ( modules = directoryImport ./.;
builtins.attrNames (builtins.readDir path)
)
)
)
)
modulesPath;
in in
{ {
flake.nixosModules = { flake.nixosModules = {
personal = {
imports = builtins.attrValues {
inherit (modules)
android
audio
bluetooth
corectrl
dconf
disks
firejail
flatpak
fonts
printing
steam
sysstat
virtualization
;
};
};
desktop = { desktop = {
imports = builtins.attrValues { imports = builtins.attrValues {
inherit (modules) inherit (modules)
hypr
wayland
mullvad mullvad
syncthing syncthing
ollama ollama
xserver
; ;
}; };
}; };
@ -68,48 +40,18 @@ in
fallaryn = { fallaryn = {
imports = builtins.attrValues { imports = builtins.attrValues {
inherit (modules) inherit (modules)
plasma
sddm
tablet tablet
; ;
}; };
}; };
plasma = { laptop = {
imports = builtins.attrValues {
inherit (modules)
plasma
sddm
;
};
};
gnome = {
imports = builtins.attrValues { imports = builtins.attrValues {
inherit (modules) inherit (modules)
gnome gnome
; xserver
};
};
hyprland = {
imports = builtins.attrValues {
inherit (modules)
hyprland
;
};
};
river = {
imports = builtins.attrValues {
inherit (modules)
river
;
};
};
wayland = {
imports = builtins.attrValues {
inherit (modules)
wayland
; ;
}; };
}; };
@ -117,7 +59,18 @@ in
server = { server = {
imports = builtins.attrValues { imports = builtins.attrValues {
inherit (modules) inherit (modules)
services acme
caddy
jellyfin
logrotate
mastodon
minecraft
ollama
website
postgresql
samba
vaultwarden
forgejo
; ;
}; };
}; };
@ -130,20 +83,19 @@ in
}; };
}; };
shared = { system = {
imports = builtins.attrValues { imports = builtins.attrValues {
inherit (modules) inherit (modules)
accounts hardware
doas programs
environment ;
gvfs };
home-manager };
locale
nh core = {
nix imports = builtins.attrValues {
rsyncd inherit (modules)
ssh core
system
xserver xserver
; ;
}; };

10
nixos/modules/core/default.nix Executable file
View file

@ -0,0 +1,10 @@
let
content = builtins.readDir ./.;
dirContent = builtins.filter (n: content.${n} == "directory") (builtins.attrNames content);
importList = map (name: ./. + "/${name}") dirContent;
in
{
imports = importList;
}

View file

@ -1,4 +1,5 @@
{flake, ...}: { { flake, ... }:
{
home-manager = { home-manager = {
useGlobalPkgs = true; useGlobalPkgs = true;
useUserPackages = true; useUserPackages = true;

View file

@ -0,0 +1,30 @@
{
time.timeZone = "America/Winnipeg";
i18n =
let
locale = "en_CA.UTF-8";
in
{
defaultLocale = locale;
extraLocaleSettings = builtins.listToAttrs (
map
(option: {
name = option;
value = locale;
})
[
"LC_ADDRESS"
"LC_IDENTIFICATION"
"LC_MEASUREMENT"
"LC_MONETARY"
"LC_NAME"
"LC_NUMERIC"
"LC_PAPER"
"LC_TELEPHONE"
"LC_TIME"
]
);
};
}

View file

@ -0,0 +1 @@
_: { }

View file

@ -1,3 +0,0 @@
{
programs.dconf.enable = true;
}

10
nixos/modules/default.nix Executable file
View file

@ -0,0 +1,10 @@
let
content = builtins.readDir ./.;
dirContent = builtins.filter (n: content.${n} == "directory") (builtins.attrNames content);
importList = map (name: ./. + "/${name}") dirContent;
in
{
imports = importList;
}

View file

@ -0,0 +1,10 @@
let
content = builtins.readDir ./.;
dirContent = builtins.filter (n: content.${n} == "directory") (builtins.attrNames content);
importList = map (name: ./. + "/${name}") dirContent;
in
{
imports = importList;
}

View file

@ -20,6 +20,7 @@
gnome-settings-daemon gnome-settings-daemon
; ;
}; };
gvfs.enable = true;
}; };
environment = { environment = {
variables = { variables = {
@ -50,4 +51,5 @@
; ;
}; };
}; };
programs.dconf.enable = true;
} }

View file

@ -0,0 +1,10 @@
let
content = builtins.readDir ./.;
dirContent = builtins.filter (n: content.${n} == "directory") (builtins.attrNames content);
importList = map (name: ./. + "/${name}") dirContent;
in
{
imports = importList;
}

View file

@ -1,10 +1,10 @@
{pkgs, ...}: { { pkgs, ... }:
{
services = { services = {
desktopManager.plasma6.enable = true; desktopManager.plasma6.enable = true;
}; };
environment.plasma6.excludePackages = builtins.attrValues { environment.plasma6.excludePackages = builtins.attrValues {
inherit inherit (pkgs.kdePackages)
(pkgs.kdePackages)
plasma-browser-integration plasma-browser-integration
konsole konsole
kate kate

View file

@ -0,0 +1,10 @@
let
content = builtins.readDir ./.;
dirContent = builtins.filter (n: content.${n} == "directory") (builtins.attrNames content);
importList = map (name: ./. + "/${name}") dirContent;
in
{
imports = importList;
}

View file

@ -1,3 +0,0 @@
{
services.gvfs.enable = true;
}

View file

@ -1,11 +1,11 @@
{pkgs, ...}: { { pkgs, ... }:
{
programs = { programs = {
adb.enable = true; adb.enable = true;
droidcam.enable = true; droidcam.enable = true;
}; };
services.udev.packages = builtins.attrValues { services.udev.packages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
android-udev-rules android-udev-rules
; ;
}; };

View file

@ -0,0 +1,10 @@
let
content = builtins.readDir ./.;
dirContent = builtins.filter (n: content.${n} == "directory") (builtins.attrNames content);
importList = map (name: ./. + "/${name}") dirContent;
in
{
imports = importList;
}

View file

@ -1,6 +0,0 @@
{
imports = map (file: ./${file}.nix) [
"hypridle"
"hyprland"
];
}

View file

@ -1,27 +0,0 @@
{
time.timeZone = "America/Winnipeg";
i18n = let
locale = "en_CA.UTF-8";
in {
defaultLocale = locale;
extraLocaleSettings =
builtins.listToAttrs
(map (option: {
name = option;
value = locale;
})
[
"LC_ADDRESS"
"LC_IDENTIFICATION"
"LC_MEASUREMENT"
"LC_MONETARY"
"LC_NAME"
"LC_NUMERIC"
"LC_PAPER"
"LC_TELEPHONE"
"LC_TIME"
]);
};
}

View file

@ -1,62 +0,0 @@
{
flake,
pkgs,
...
}:
let
inherit (flake.config.services.instances)
ollama
web
;
service = ollama;
localhost = web.localhost.address0;
in
{
services = {
ollama = {
acceleration = "rocm";
package = pkgs.ollama.override {
config = {
rocmSupport = true;
cudaSupport = false;
};
};
enable = true;
group = service.name;
host = "http://${localhost}";
models = service.paths.path1;
user = service.name;
};
open-webui = {
enable = true;
host = localhost;
port = service.ports.port0;
environment = {
ENABLE_OLLAMA_API = "True";
ANONYMIZED_TELEMETRY = "False";
DO_NOT_TRACK = "True";
SCARF_NO_ANALYTICS = "True";
OLLAMA_BASE_URL = "http://${localhost}:${toString service.ports.port1}";
WEBUI_AUTH = "True";
};
};
};
users.users.${service.name}.extraGroups = [
"users"
];
systemd.tmpfiles.rules = [
"Z ${service.paths.path1} 0777 ${service.name} ${service.name} -"
];
networking = {
firewall = {
allowedTCPPorts = [
# 8080
service.ports.port0
service.ports.port1
];
};
};
}

View file

@ -1,4 +1,5 @@
{pkgs, ...}: { { pkgs, ... }:
{
programs.corectrl = { programs.corectrl = {
enable = true; enable = true;
package = pkgs.corectrl; package = pkgs.corectrl;

View file

@ -0,0 +1,10 @@
let
content = builtins.readDir ./.;
dirContent = builtins.filter (n: content.${n} == "directory") (builtins.attrNames content);
importList = map (name: ./. + "/${name}") dirContent;
in
{
imports = importList;
}

View file

@ -1,12 +1,12 @@
{pkgs, ...}: { { pkgs, ... }:
{
programs = { programs = {
steam = { steam = {
enable = true; enable = true;
remotePlay.openFirewall = true; remotePlay.openFirewall = true;
dedicatedServer.openFirewall = true; dedicatedServer.openFirewall = true;
extraPackages = builtins.attrValues { extraPackages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
curl curl
; ;
}; };

View file

@ -1,6 +1,6 @@
{flake, ...}: let { flake, ... }:
inherit let
(flake.config.services.instances) inherit (flake.config.services.instances)
caddy caddy
web web
; ;
@ -8,7 +8,8 @@
domain0 = web.domains.url0; domain0 = web.domains.url0;
service = caddy; service = caddy;
in { in
{
services.caddy = { services.caddy = {
enable = true; enable = true;
virtualHosts = { virtualHosts = {

View file

@ -1,22 +1,10 @@
let
content = builtins.readDir ./.;
dirContent = builtins.filter (n: content.${n} == "directory") (builtins.attrNames content);
importList = map (name: ./. + "/${name}") dirContent;
in
{ {
imports = imports = importList;
(map (folder: ./${folder}) [
"mastodon"
])
++ (map (file: ./${file}.nix) [
"acme"
"caddy"
"jellyfin"
"logrotate"
"minecraft"
"ollama"
"upRootNutrition"
# "peertube"
"postgresql"
# "owncast"
"samba"
"vaultwarden"
"forgejo"
# "nextcloud"
]);
} }

View file

@ -1,21 +1,20 @@
{flake, ...}: let { flake, ... }:
inherit let
(flake.config.people) inherit (flake.config.people)
user0 user0
; ;
inherit inherit (flake.config.machines.devices)
(flake.config.machines.devices)
server server
; ;
inherit inherit (flake.config.services.instances)
(flake.config.services.instances)
jellyfin jellyfin
web web
; ;
service = jellyfin; service = jellyfin;
localhost = web.localhost.address0; localhost = web.localhost.address0;
host = "${service.subdomain}.${web.domains.url0}"; host = "${service.subdomain}.${web.domains.url0}";
in { in
{
services = { services = {
jellyfin = { jellyfin = {
enable = true; enable = true;
@ -42,7 +41,8 @@ in {
}; };
}; };
fileSystems = let fileSystems =
let
settings = { settings = {
fsType = "none"; fsType = "none";
options = [ options = [
@ -52,17 +52,14 @@ in {
server.storage0.mount server.storage0.mount
]; ];
}; };
in { in
"/var/lib/${service.name}" =
{ {
"/var/lib/${service.name}" = {
device = service.paths.path0; device = service.paths.path0;
} } // settings;
// settings; "/var/cache/${service.name}" = {
"/var/cache/${service.name}" =
{
device = "${service.paths.path0}/cache"; device = "${service.paths.path0}/cache";
} } // settings;
// settings;
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [

View file

@ -2,17 +2,17 @@
config, config,
flake, flake,
... ...
}: let }:
inherit let
(flake.config.machines.devices) inherit (flake.config.machines.devices)
server server
; ;
inherit inherit (flake.config.services.instances)
(flake.config.services.instances)
minecraft minecraft
; ;
service = minecraft; service = minecraft;
in { in
{
services = { services = {
minecraft-server = { minecraft-server = {
enable = true; enable = true;
@ -55,13 +55,15 @@ in {
}; };
}; };
}; };
sops = let sops =
let
sopsPath = secret: { sopsPath = secret: {
path = "${service.sops.path0}/${service.name}-${secret}"; path = "${service.sops.path0}/${service.name}-${secret}";
owner = service.name; owner = service.name;
mode = "600"; mode = "600";
}; };
in { in
{
secrets = builtins.listToAttrs ( secrets = builtins.listToAttrs (
map map
(secret: { (secret: {

View file

@ -3,21 +3,18 @@
config, config,
pkgs, pkgs,
... ...
}: let }:
inherit let
(flake.config.people) inherit (flake.config.people)
user0 user0
; ;
inherit inherit (flake.config.people.users.${user0})
(flake.config.people.users.${user0})
name name
; ;
inherit inherit (flake.config.machines.devices)
(flake.config.machines.devices)
server server
; ;
inherit inherit (flake.config.services.instances)
(flake.config.services.instances)
nextcloud nextcloud
nginx nginx
web web
@ -25,7 +22,8 @@
service = nextcloud; service = nextcloud;
localhost = web.localhost.address0; localhost = web.localhost.address0;
host = "${service.subdomain}.${web.domains.url1}"; host = "${service.subdomain}.${web.domains.url1}";
in { in
{
services = { services = {
nextcloud = { nextcloud = {
appstoreEnable = true; appstoreEnable = true;
@ -38,8 +36,7 @@ in {
phpOptions."opcache.interned_strings_buffer" = "24"; phpOptions."opcache.interned_strings_buffer" = "24";
extraAppsEnable = true; extraAppsEnable = true;
extraApps = { extraApps = {
inherit inherit (config.services.service.package.packages.apps)
(config.services.service.package.packages.apps)
contacts contacts
calendar calendar
; ;
@ -88,13 +85,15 @@ in {
}; };
}; };
sops = let sops =
let
sopsPath = secret: { sopsPath = secret: {
path = "${service.sops.path0}/${service.name}-${secret}"; path = "${service.sops.path0}/${service.name}-${secret}";
owner = service.name; owner = service.name;
mode = "600"; mode = "600";
}; };
in { in
{
secrets = builtins.listToAttrs ( secrets = builtins.listToAttrs (
map map
(secret: { (secret: {

View file

@ -1,75 +0,0 @@
{flake, ...}: let
inherit
(flake.config.machines.devices)
server
;
inherit
(flake.config.services.instances)
ollama
web
;
service = ollama;
localhost = web.localhost.address0;
host = "${service.subdomain}.${web.domains.url0}";
in {
services = {
ollama = {
acceleration = false;
enable = true;
group = service.name;
host = "http://${localhost}";
port = service.ports.port1;
user = service.name;
};
open-webui = {
enable = true;
host = localhost;
port = service.ports.port0;
environment = {
ENABLE_OLLAMA_API = "True";
ANONYMIZED_TELEMETRY = "False";
DO_NOT_TRACK = "True";
SCARF_NO_ANALYTICS = "True";
OLLAMA_BASE_URL = "http://${localhost}:${toString service.ports.port1}";
WEBUI_AUTH = "True";
};
};
caddy = {
virtualHosts = {
${host} = {
extraConfig = ''
reverse_proxy ${localhost}:${toString service.ports.port0}
tls ${service.ssl.cert} ${service.ssl.key}
'';
};
};
};
};
fileSystems."/var/lib/${service.name}" = {
device = service.paths.path0;
fsType = "none";
options = [
"bind"
];
depends = [
server.storage0.mount
];
};
systemd.tmpfiles.rules = [
"Z ${service.paths.path0} 0755 ${service.name} ${service.name} -"
];
networking = {
firewall = {
allowedTCPPorts = [
service.ports.port0
service.ports.port1
];
};
};
}

View file

@ -0,0 +1,117 @@
{
flake,
config,
pkgs,
...
}:
let
inherit (flake.config.machines.devices)
desktop
server
;
inherit (flake.config.services.instances)
ollama
web
;
service = ollama;
localhost = web.localhost.address0;
hostname = config.networking.hostName;
host = "${service.subdomain}.${web.domains.url0}";
caddyLogic =
if hostname == server.name then
{
caddy = {
virtualHosts = {
${host} = {
extraConfig = ''
reverse_proxy ${localhost}:${toString service.ports.port0}
tls ${service.ssl.cert} ${service.ssl.key}
'';
};
};
};
}
else
{ };
mountLogic =
if hostname == server.name then
{
"/var/lib/${service.name}" = {
device = service.paths.path0;
fsType = "none";
options = [
"bind"
];
depends = [
server.storage0.mount
];
};
}
else
{ };
in
{
services = {
ollama =
{
enable = true;
group = service.name;
host = "http://${localhost}";
user = service.name;
}
// (
if hostname == desktop.name then
{
acceleration = "rocm";
package = pkgs.ollama.override {
config = {
rocmSupport = true;
cudaSupport = false;
};
};
}
else
{
port = service.ports.port1;
acceleration = false;
models = service.paths.path1;
}
);
open-webui = {
enable = true;
host = localhost;
port = service.ports.port0;
environment = {
ENABLE_OLLAMA_API = "True";
ANONYMIZED_TELEMETRY = "False";
DO_NOT_TRACK = "True";
SCARF_NO_ANALYTICS = "True";
OLLAMA_BASE_URL = "http://${localhost}:${toString service.ports.port1}";
WEBUI_AUTH = "True";
};
};
} // caddyLogic;
systemd.tmpfiles.rules = [
(
if hostname == desktop.name then
"Z ${service.paths.path1} 0777 ${service.name} ${service.name} -"
else
"Z ${service.paths.path0} 0755 ${service.name} ${service.name} -"
)
];
networking = {
firewall = {
allowedTCPPorts = [
# 8080
service.ports.port0
service.ports.port1
];
};
};
fileSystems = mountLogic;
}

View file

@ -1,13 +1,14 @@
{flake, ...}: let { flake, ... }:
inherit let
(flake.config.services.instances) inherit (flake.config.services.instances)
owncast owncast
web web
; ;
service = owncast; service = owncast;
localhost = web.localhost.address1; localhost = web.localhost.address1;
host = "${service.subdomain}.${web.domains.url1}"; host = "${service.subdomain}.${web.domains.url1}";
in { in
{
services = { services = {
owncast = { owncast = {
enable = true; enable = true;

View file

@ -2,14 +2,15 @@
pkgs, pkgs,
flake, flake,
... ...
}: let }:
inherit let
(flake.config.services.instances) inherit (flake.config.services.instances)
samba samba
jellyfin jellyfin
; ;
service = samba; service = samba;
in { in
{
# If you ever need to start fresh, you need to add yourself to the Samba users database: # If you ever need to start fresh, you need to add yourself to the Samba users database:
# sudo smbpasswd -a username # sudo smbpasswd -a username
services = { services = {

View file

@ -1,12 +1,13 @@
{flake, ...}: let { flake, ... }:
inherit let
(flake.config.services.instances) inherit (flake.config.services.instances)
upRootNutrition upRootNutrition
web web
; ;
service = upRootNutrition; service = upRootNutrition;
host = web.domains.url3; host = web.domains.url3;
in { in
{
services = { services = {
caddy = { caddy = {
virtualHosts = { virtualHosts = {

View file

@ -25,7 +25,7 @@ let
in in
{ {
sops = { sops = {
defaultSopsFile = ../../secrets/secrets.yaml; defaultSopsFile = ../../../secrets/secrets.yaml;
validateSopsFiles = false; validateSopsFiles = false;
age = { age = {
keyFile = "/var/lib/sops-nix/key.txt"; keyFile = "/var/lib/sops-nix/key.txt";

View file

@ -1 +0,0 @@
_: {}

View file

@ -1,11 +0,0 @@
{
imports = map (file: ./${file}.nix) [
"geoclue2"
"greetd"
"network"
"regreet"
"swaylock"
"thunar"
"wayland"
];
}

View file

@ -2,18 +2,21 @@
pkgs, pkgs,
pkgs-stable, pkgs-stable,
... ...
}: { }:
{
devShells = { devShells = {
default = pkgs.mkShell { default = pkgs.mkShell {
packages = builtins.attrValues { packages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs) age
just just
nixd
nil nil
nixd
sops
ssh-to-age
nixfmt-rfc-style
; ;
inherit inherit (pkgs-stable.elmPackages)
(pkgs-stable.elmPackages)
elm elm
elm-format elm-format
elm-land elm-land
@ -21,8 +24,7 @@
elm-review elm-review
elm-test elm-test
; ;
inherit inherit (pkgs.haskellPackages)
(pkgs.haskellPackages)
nixfmt nixfmt
; ;
}; };

View file

@ -2,57 +2,38 @@
pkgs, pkgs,
config, config,
... ...
}: { }:
{
haskellProjects.default = { haskellProjects.default = {
devShell = { devShell = {
enable = true; enable = true;
tools = hp: { tools = hp: {
inherit inherit (hp)
(hp)
cabal-fmt cabal-fmt
haskell-language-server haskell-language-server
; ;
inherit inherit (pkgs)
(pkgs)
dhall dhall
dhall-json dhall-json
dhall-lsp-server dhall-lsp-server
helix-gpt helix-gpt
nixd age
just just
libz
ngrep
nil nil
nixd
sops sops
ssh-to-age ssh-to-age
nixfmt-rfc-style
libz
ngrep
stripe-cli stripe-cli
vscode-langservers-extracted vscode-langservers-extracted
zlib zlib
; ;
inherit inherit (pkgs.haskellPackages)
(pkgs.elmPackages)
elm
elm-format
elm-land
elm-language-server
elm-review
elm-test
;
inherit
(pkgs.nodePackages_latest)
"@commitlint/config-conventional"
dotenv-cli
forever
nodejs
npm
typescript-language-server
;
inherit
(pkgs.haskellPackages)
nixfmt nixfmt
; ;
}; };