Compare commits

...

18 commits

Author SHA1 Message Date
2c0062bf51 flake: home-manager: export NixOS homes
All checks were successful
ci/woodpecker/push/check Pipeline was successful
And here is what the last few commits were building up to.

This is neat, but won't be useful *very* often.
2025-07-07 15:08:04 +00:00
31effae175 flake: home-manager: refactor 'mkHome'
This will allow making a similar function for NixOS homes.
2025-07-07 15:08:04 +00:00
87ba726b18 flake: home-manager: use 'hosts' option 2025-07-07 15:08:04 +00:00
9e35764e0c flake: nixos: use 'hosts' option 2025-07-07 15:08:04 +00:00
1c86c85c56 flake: add hosts
This will allow other modules to cross-reference which hosts exist on
which system.

My main use-case is to automatically declare home-manager configuration
for the home configuration of NixOS hosts.

I also include Darwin in case I ever want to use that in the future,
though that is unlikely for the moment.
2025-07-07 15:08:04 +00:00
7ac78ca260 hosts: nixos: porthos: add profiles 2025-07-07 15:08:04 +00:00
d181f3a719 common: profiles: forward profiles to home-manager
We can only do this now that every profile has been migrated, otherwise
we would get errors about undeclared modules... It's not perfect, but
it's good enough.
2025-07-07 15:08:04 +00:00
2a6696bafc common: profiles: migrate X 2025-07-07 15:08:03 +00:00
75f1776916 common: profiles: migrate wm 2025-07-07 15:08:03 +00:00
b1be9f20d9 common: profiles: migrate laptop 2025-07-07 15:08:03 +00:00
a68c26c6ef common: profiles: migrate gtk 2025-07-07 15:08:03 +00:00
9ee0cb3287 common: profiles: migrate devices 2025-07-07 15:08:03 +00:00
e01c8330d6 common: profiles: migrate bluetooth 2025-07-07 15:08:03 +00:00
033b0e8a57 common: add profiles
I will be migrating each sub-module one by one.
2025-07-07 15:08:03 +00:00
27a486bf5c flake: nixos: import common modules 2025-07-07 15:08:03 +00:00
5d706dd2dc flake: home-manager: import common modules 2025-07-07 15:08:03 +00:00
748e55f1a6 nixos: home: import common modules 2025-07-07 15:08:03 +00:00
2ed60a227e modules: add common
This should define modules that are identical, or very similar.

The driving force is to be able to use `my.profiles` on home-manager and NixOS
without repeating myself.

In the future I might migrate other modules, such as `nixos/system/nix`...
2025-07-07 15:08:02 +00:00
23 changed files with 280 additions and 158 deletions

View file

@ -13,6 +13,7 @@ flake-parts.lib.mkFlake { inherit inputs; } {
./checks.nix
./dev-shells.nix
./home-manager.nix
./hosts.nix
./lib.nix
./nixos.nix
./overlays.nix

View file

@ -1,5 +1,7 @@
{ self, inputs, lib, ... }:
{ self, config, inputs, lib, ... }:
let
inherit (config) hosts;
defaultModules = [
# Include generic settings
"${self}/modules/home"
@ -19,14 +21,14 @@ let
# Enable home-manager
programs.home-manager.enable = true;
}
# Import common modules
"${self}/modules/common"
];
mkHome = name: system: inputs.home-manager.lib.homeManagerConfiguration {
mkHomeCommon = mainModules: system: inputs.home-manager.lib.homeManagerConfiguration {
pkgs = inputs.nixpkgs.legacyPackages.${system};
modules = defaultModules ++ [
"${self}/hosts/homes/${name}"
];
modules = defaultModules ++ mainModules;
# Use my extended lib in NixOS configuration
inherit (self) lib;
@ -37,24 +39,41 @@ let
};
};
homes = {
mkHome = name: mkHomeCommon [ "${self}/hosts/homes/${name}" ];
mkNixosHome = name: mkHomeCommon [
"${self}/hosts/nixos/${name}/home.nix"
"${self}/hosts/nixos/${name}/profiles.nix"
];
in
{
hosts.homes = {
"ambroisie@bazin" = "x86_64-linux";
"ambroisie@mousqueton" = "x86_64-linux";
};
in
{
perSystem = { system, ... }: {
# Work-around for https://github.com/nix-community/home-manager/issues/3075
legacyPackages = {
homeConfigurations =
let
filteredHomes = lib.filterAttrs (_: v: v == system) homes;
filteredHomes = lib.filterAttrs (_: v: v == system) hosts.homes;
allHomes = filteredHomes // {
# Default configuration
ambroisie = system;
};
homeManagerHomes = lib.mapAttrs mkHome allHomes;
filteredNixosHosts = lib.filterAttrs (_: v: v == system) hosts.nixos;
nixosHomes' = lib.mapAttrs mkNixosHome filteredNixosHosts;
nixosHomeUsername = (host: self.nixosConfigurations.${host}.config.my.user.name);
nixosHomes = lib.mapAttrs' (host: lib.nameValuePair "${nixosHomeUsername host}@${host}") nixosHomes';
in
lib.mapAttrs mkHome allHomes;
lib.foldl' lib.mergeAttrs { }
[
homeManagerHomes
nixosHomes
];
};
};
}

21
flake/hosts.nix Normal file
View file

@ -0,0 +1,21 @@
# Define `hosts.{darwin,home,nixos}` options for consumption in other modules
{ lib, ... }:
let
mkHostsOption = description: lib.mkOption {
inherit description;
type = with lib.types; attrsOf str;
default = { };
example = { name = "x86_64-linux"; };
};
in
{
options = {
hosts = {
darwin = mkHostsOption "Darwin hosts";
homes = mkHostsOption "Home Manager hosts";
nixos = mkHostsOption "NixOS hosts";
};
};
}

View file

@ -1,4 +1,4 @@
{ self, inputs, lib, ... }:
{ self, config, inputs, lib, ... }:
let
defaultModules = [
{
@ -12,6 +12,8 @@ let
}
# Include generic settings
"${self}/modules/nixos"
# Import common modules
"${self}/modules/common"
];
buildHost = name: system: lib.nixosSystem {
@ -30,8 +32,12 @@ let
};
in
{
flake.nixosConfigurations = lib.mapAttrs buildHost {
aramis = "x86_64-linux";
porthos = "x86_64-linux";
config = {
hosts.nixos = {
aramis = "x86_64-linux";
porthos = "x86_64-linux";
};
flake.nixosConfigurations = lib.mapAttrs buildHost config.hosts.nixos;
};
}

View file

@ -7,6 +7,7 @@
./hardware.nix
./home.nix
./networking.nix
./profiles.nix
./secrets
./services.nix
./system.nix

View file

@ -0,0 +1,4 @@
{ ... }:
{
# Nothing
}

View file

@ -0,0 +1,28 @@
# Modules that are common to various module systems
# Usually with very small differences, if any, between them.
{ lib, _class, ... }:
let
allowedClass = [
"darwin"
"homeManager"
"nixos"
];
allowedClassString = lib.concatStringSep ", " (builtins.map lib.escapeNixString allowedClass);
in
{
imports = [
./profiles
];
config = {
assertions = [
{
assertion = builtins.elem _class allowedClass;
message = ''
`_class` specialArgs must be one of ${allowedClassString}.
'';
}
];
};
}

View file

@ -0,0 +1,19 @@
{ config, lib, _class, ... }:
let
cfg = config.my.profiles.bluetooth;
in
{
options.my.profiles.bluetooth = with lib; {
enable = mkEnableOption "bluetooth profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (_class == "homeManager") {
my.home.bluetooth.enable = true;
})
(lib.optionalAttrs (_class == "nixos") {
my.hardware.bluetooth.enable = true;
})
]);
}

View file

@ -0,0 +1,25 @@
# Configuration that spans across system and home, or are almagations of modules
{ config, lib, _class, ... }:
{
imports = [
./bluetooth
./devices
./gtk
./laptop
./wm
./x
];
config = lib.mkMerge [
# Transparently enable home-manager profiles as well
(lib.optionalAttrs (_class != "homeManager") {
home-manager.users.${config.my.user.name} = {
config = {
my = {
inherit (config.my) profiles;
};
};
};
})
];
}

View file

@ -0,0 +1,22 @@
{ config, lib, _class, ... }:
let
cfg = config.my.profiles.devices;
in
{
options.my.profiles.devices = with lib; {
enable = mkEnableOption "devices profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (_class == "nixos") {
my.hardware = {
ergodox.enable = true;
trackball.enable = true;
};
# MTP devices auto-mount via file explorers
services.gvfs.enable = true;
})
]);
}

View file

@ -0,0 +1,21 @@
{ config, lib, _class, ... }:
let
cfg = config.my.profiles.gtk;
in
{
options.my.profiles.gtk = with lib; {
enable = mkEnableOption "gtk profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (_class == "homeManager") {
# GTK theme configuration
my.home.gtk.enable = true;
})
(lib.optionalAttrs (_class == "nixos") {
# Allow setting GTK configuration using home-manager
programs.dconf.enable = true;
})
]);
}

View file

@ -0,0 +1,27 @@
{ config, lib, _class, ... }:
let
cfg = config.my.profiles.laptop;
in
{
options.my.profiles.laptop = with lib; {
enable = mkEnableOption "laptop profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (_class == "homeManager") {
# Enable battery notifications
my.home.power-alert.enable = true;
})
(lib.optionalAttrs (_class == "nixos") {
# Enable touchpad support
services.libinput.enable = true;
# Enable TLP power management
my.services.tlp.enable = true;
# Enable upower power management
my.hardware.upower.enable = true;
})
]);
}

View file

@ -0,0 +1,38 @@
{ config, lib, _class, ... }:
let
cfg = config.my.profiles.wm;
applyWm = wm: configs: lib.mkIf (cfg.windowManager == wm) (lib.my.merge configs);
in
{
options.my.profiles.wm = with lib; {
windowManager = mkOption {
type = with types; nullOr (enum [ "i3" ]);
default = null;
example = "i3";
description = "Which window manager to use";
};
};
config = lib.mkMerge [
(applyWm "i3" [
(lib.optionalAttrs (_class == "homeManager") {
# i3 settings
my.home.wm.windowManager = "i3";
# Screenshot tool
my.home.flameshot.enable = true;
# Auto disk mounter
my.home.udiskie.enable = true;
})
(lib.optionalAttrs (_class == "nixos") {
# Enable i3
services.xserver.windowManager.i3.enable = true;
# udiskie fails if it can't find this dbus service
services.udisks2.enable = true;
# Ensure i3lock can actually unlock the session
security.pam.services.i3lock.enable = true;
})
])
];
}

View file

@ -0,0 +1,27 @@
{ config, lib, pkgs, _class, ... }:
let
cfg = config.my.profiles.x;
in
{
options.my.profiles.x = with lib; {
enable = mkEnableOption "X profile";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
(lib.optionalAttrs (_class == "homeManager") {
# X configuration
my.home.x.enable = true;
})
(lib.optionalAttrs (_class == "nixos") {
# Enable the X11 windowing system.
services.xserver.enable = true;
# Nice wallpaper
services.xserver.displayManager.lightdm.background =
let
wallpapers = "${pkgs.plasma5Packages.plasma-workspace-wallpapers}/share/wallpapers";
in
"${wallpapers}/summer_1am/contents/images/2560x1600.jpg";
})
]);
}

View file

@ -5,7 +5,6 @@
imports = [
./hardware
./home
./profiles
./programs
./secrets
./services

View file

@ -13,8 +13,13 @@ in
config = lib.mkIf cfg.enable {
home-manager = {
# Not a fan of out-of-directory imports, but this is a good exception
users.${config.my.user.name} = import "${inputs.self}/modules/home";
users.${config.my.user.name} = {
# Not a fan of out-of-directory imports, but this is a good exception
imports = [
"${inputs.self}/modules/common"
"${inputs.self}/modules/home"
];
};
# Nix Flakes compatibility
useGlobalPkgs = true;

View file

@ -1,15 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.bluetooth;
in
{
options.my.profiles.bluetooth = with lib; {
enable = mkEnableOption "bluetooth profile";
};
config = lib.mkIf cfg.enable {
my.hardware.bluetooth.enable = true;
my.home.bluetooth.enable = true;
};
}

View file

@ -1,12 +0,0 @@
# Configuration that spans across system and home, or are almagations of modules
{ ... }:
{
imports = [
./bluetooth
./devices
./gtk
./laptop
./wm
./x
];
}

View file

@ -1,20 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.devices;
in
{
options.my.profiles.devices = with lib; {
enable = mkEnableOption "devices profile";
};
config = lib.mkIf cfg.enable {
my.hardware = {
ergodox.enable = true;
trackball.enable = true;
};
# MTP devices auto-mount via file explorers
services.gvfs.enable = true;
};
}

View file

@ -1,17 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.gtk;
in
{
options.my.profiles.gtk = with lib; {
enable = mkEnableOption "gtk profile";
};
config = lib.mkIf cfg.enable {
# Allow setting GTK configuration using home-manager
programs.dconf.enable = true;
# GTK theme configuration
my.home.gtk.enable = true;
};
}

View file

@ -1,23 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.laptop;
in
{
options.my.profiles.laptop = with lib; {
enable = mkEnableOption "laptop profile";
};
config = lib.mkIf cfg.enable {
# Enable touchpad support
services.libinput.enable = true;
# Enable TLP power management
my.services.tlp.enable = true;
# Enable upower power management
my.hardware.upower.enable = true;
# Enable battery notifications
my.home.power-alert.enable = true;
};
}

View file

@ -1,31 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.profiles.wm;
in
{
options.my.profiles.wm = with lib; {
windowManager = mkOption {
type = with types; nullOr (enum [ "i3" ]);
default = null;
example = "i3";
description = "Which window manager to use";
};
};
config = lib.mkMerge [
(lib.mkIf (cfg.windowManager == "i3") {
# Enable i3
services.xserver.windowManager.i3.enable = true;
# i3 settings
my.home.wm.windowManager = "i3";
# Screenshot tool
my.home.flameshot.enable = true;
# Auto disk mounter
my.home.udiskie.enable = true;
# udiskie fails if it can't find this dbus service
services.udisks2.enable = true;
# Ensure i3lock can actually unlock the session
security.pam.services.i3lock.enable = true;
})
];
}

View file

@ -1,23 +0,0 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.profiles.x;
in
{
options.my.profiles.x = with lib; {
enable = mkEnableOption "X profile";
};
config = lib.mkIf cfg.enable {
# Enable the X11 windowing system.
services.xserver.enable = true;
# Nice wallpaper
services.xserver.displayManager.lightdm.background =
let
wallpapers = "${pkgs.plasma5Packages.plasma-workspace-wallpapers}/share/wallpapers";
in
"${wallpapers}/summer_1am/contents/images/2560x1600.jpg";
# X configuration
my.home.x.enable = true;
};
}