# hosts/common/users/m3tam3re.nix — Central user definition with m3ta-home integration. # # This module: # 1. Creates the m3tam3re NixOS user # 2. Loads the m3ta-home profile system via mkHome # 3. Sets per-host feature flags based on a host profile mapping # 4. Imports per-host home.nix overrides (monitors, HW-specific config) { config, pkgs, inputs, ... }: let hostname = config.networking.hostName; # ── Per-host profile mapping ── # Determines which m3ta-home context and sets each host gets. # To add a new host: add an entry here + create hosts//home.nix if needed. hostProfiles = { m3-ares = { context = "desktop"; sets = ["coding" "gaming" "media"]; }; m3-kratos = { context = "desktop"; sets = ["coding" "gaming" "media"]; }; m3-atlas = { context = "server"; sets = ["coding"]; }; m3-helios = { context = "server"; sets = []; }; m3-hermes = { context = "server"; sets = []; }; m3-aether = { context = "server"; sets = []; }; }; profile = hostProfiles.${hostname} or {context = "server"; sets = [];}; m3ta-lib = inputs.m3ta-home.lib; # Check if a per-host home.nix exists hostHomeFile = ./../../${hostname}/home.nix; hostHomeExists = builtins.pathExists hostHomeFile; in { # ── NixOS user definition ── users.users.m3tam3re = { password = "12345"; isNormalUser = true; description = "m3tam3re"; extraGroups = [ "wheel" "networkmanager" "libvirtd" "flatpak" "audio" "video" "plugdev" "input" "kvm" "qemu-libvirtd" "adbusers" ]; openssh.authorizedKeys.keys = [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC3YEmpYbM+cpmyD10tzNRHEn526Z3LJOzYpWEKdJg8DaYyPbDn9iyVX30Nja2SrW4Wadws0Y8DW+Urs25/wVB6mKl7jgPJVkMi5hfobu3XAz8gwSdjDzRSWJrhjynuaXiTtRYED2INbvjLuxx3X8coNwMw58OuUuw5kNJp5aS2qFmHEYQErQsGT4MNqESe3jvTP27Z5pSneBj45LmGK+RcaSnJe7hG+KRtjuhjI7RdzMeDCX73SfUsal+rHeuEw/mmjYmiIItXhFTDn8ZvVwpBKv7xsJG90DkaX2vaTk0wgJdMnpVIuIRBa4EkmMWOQ3bMLGkLQeK/4FUkNcvQ/4+zcZsg4cY9Q7Fj55DD41hAUdF6SYODtn5qMPsTCnJz44glHt/oseKXMSd556NIw2HOvihbJW7Rwl4OEjGaO/dF4nUw4c9tHWmMn9dLslAVpUuZOb7ykgP0jk79ldT3Dv+2Hj0CdAWT2cJAdFX58KQ9jUPT3tBnObSF1lGMI7t77VU= m3tam3re@m3-nix" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBZcjCKl0DRuOUOMXbM0GKY5JjvmyFpVZ/tRlTKWu/zp razr" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEZbg/Z9mnflXuLahGY8WOSBMqbgeqVIkIwRkquys1Ml sascha.koenig@azintec.com" ]; packages = [inputs.home-manager.packages.${pkgs.stdenv.hostPlatform.system}.default]; }; # ── Home-Manager configuration via m3ta-home ── home-manager.users.m3tam3re = { imports = [ # Load m3ta-home composition engine (m3ta-lib.mkHome { user = "m3tam3re"; identity = "private"; inherit (profile) context sets; }) ] # Per-host feature flag overrides ++ ( if hostname == "m3-ares" || hostname == "m3-kratos" then [ # Desktop feature flags (both desktop hosts are identical) { base = { shell = { fish.enable = true; nushell.enable = true; starship.enable = true; }; cliTools = { fzf.enable = true; nitch.enable = true; television.enable = true; }; secrets.enable = true; }; desktop = { wm = { hyprland.enable = true; rofi.enable = true; wayland.enable = true; }; apps = { crypto.enable = true; obsidian.enable = true; office.enable = true; }; theme = { fonts.enable = true; wallpapers.enable = true; }; }; coding = { editors = { neovim.enable = true; zed.enable = true; }; lsp.enable = true; packages.enable = true; languages = { python.enable = true; javascript.enable = true; rustToolchain.enable = true; go.enable = true; typescript.enable = true; }; }; profiles.gaming = { steam.enable = true; gamescope.enable = true; }; profiles.media = { obs.enable = true; ffmpeg.enable = true; kdenlive.enable = true; ytDlp.enable = true; }; } ] else if hostname == "m3-atlas" then [ { base = { shell = { nushell.enable = true; starship.enable = true; }; cliTools = { fzf.enable = true; nitch.enable = true; zellij.enable = true; }; }; coding.editors.neovim.enable = true; } ] else # m3-helios, m3-hermes, m3-aether — minimal server [ { base = { shell = { fish.enable = true; starship.enable = true; }; cliTools = { fzf.enable = true; nitch.enable = true; }; }; } ] ) # Per-host home.nix (Hyprland monitors, HW-specific overrides) ++ ( if hostHomeExists then [hostHomeFile] else [] ); }; }