# Work Tools Module Design Document ## Overview A modular NixOS configuration for work-specific development tools and services. This allows clean separation between personal and work machines while enabling easy reuse across multiple work systems. --- ## Module Structure ### Proposed Location ``` shared/modules/work/work_tools.nix ``` This places it in the shared modules directory since it could be used across multiple work machines. ### Alternative Location ``` nate-work/modules/work/work_tools.nix ``` Use this if the tools are specific to a single work environment. --- ## Module Design ### Basic Structure ```nix { inputs, lib, config, pkgs, ... }: let unstable = import inputs.nixpkgs-unstable { system = "x86_64-linux"; config.allowUnfree = true; }; in { options.work_tools = { enable = lib.mkEnableOption "Enable work development tools and services"; enableDocker = lib.mkOption { type = lib.types.bool; default = true; description = "Enable Docker and related containerization tools"; }; enableVirtualization = lib.mkOption { type = lib.types.bool; default = true; description = "Enable QEMU/KVM virtualization"; }; enableGoTools = lib.mkOption { type = lib.types.bool; default = true; description = "Enable Go development toolchain"; }; enableNodeTools = lib.mkOption { type = lib.types.bool; default = true; description = "Enable Node.js development tools"; }; enableDatabaseTools = lib.mkOption { type = lib.types.bool; default = true; description = "Enable database clients and tools"; }; user = lib.mkOption { type = lib.types.str; description = "Username for service configurations"; }; }; config = lib.mkIf config.work_tools.enable { # Docker configuration virtualisation.docker = lib.mkIf config.work_tools.enableDocker { enable = true; enableOnBoot = true; package = unstable.docker_25; }; users.groups.docker.members = lib.mkIf config.work_tools.enableDocker [ config.work_tools.user ]; # Virtualization virtualisation.libvirtd = lib.mkIf config.work_tools.enableVirtualization { enable = true; qemu = { swtpm.enable = true; }; }; virtualisation.spiceUSBRedirection.enable = lib.mkIf config.work_tools.enableVirtualization true; users.groups.libvirtd.members = lib.mkIf config.work_tools.enableVirtualization [ config.work_tools.user ]; programs.virt-manager.enable = lib.mkIf config.work_tools.enableVirtualization true; # NFS support (if needed for remote dev environments) boot.initrd.supportedFilesystems = lib.mkIf config.work_tools.enableVirtualization { nfs = true; }; # System packages that don't fit into categories environment.systemPackages = with pkgs; lib.lists.flatten [ (lib.optionals config.work_tools.enableDocker [ docker-compose ]) ]; }; } ``` ### Home Manager Companion Module Create a companion home-manager module for user-level packages: ``` shared/modules/work/work_tools_home.nix ``` ```nix { inputs, lib, config, pkgs, ... }: let unstable = import inputs.nixpkgs-unstable { system = "x86_64-linux"; config.allowUnfree = true; }; in { options.work_tools_home = { enable = lib.mkEnableOption "Enable work development tools in home"; enableGoTools = lib.mkOption { type = lib.types.bool; default = true; description = "Enable Go development toolchain"; }; enableNodeTools = lib.mkOption { type = lib.types.bool; default = true; description = "Enable Node.js development tools"; }; enableDatabaseTools = lib.mkOption { type = lib.types.bool; default = true; description = "Enable database clients"; }; enableAwsTools = lib.mkOption { type = lib.types.bool; default = true; description = "Enable AWS CLI and related tools"; }; }; config = lib.mkIf config.work_tools_home.enable { home.packages = with pkgs; lib.lists.flatten [ # Development tools (lib.optionals config.work_tools_home.enableGoTools [ go unstable.delve gotools go-tools govulncheck unstable.golangci-lint go-swag gopls ]) (lib.optionals config.work_tools_home.enableNodeTools [ nodejs_24 husky pnpm yarn typescript-language-server ]) (lib.optionals config.work_tools_home.enableDatabaseTools [ mariadb ]) (lib.optionals config.work_tools_home.enableAwsTools [ awscli2 ]) # General dev tools vscode-fhs jq gnumake cmake gcc gh trivy oxker # docker TUI # Additional LSPs yaml-language-server ltex-ls ]; # Work-specific zsh configuration programs.zsh.initExtra = lib.mkIf config.work_tools_home.enable '' # Work environment variables if [ -f ~/.vasion_env ]; then source ~/.vasion_env fi # Work functions if [ -f ~/.config/zsh_functions.zsh ]; then source ~/.config/zsh_functions.zsh fi export GOBIN=~/go/bin export PATH=$PATH:$GOBIN ''; }; } ``` --- ## Integration Steps ### 1. Create the module files - [ ] Create `shared/modules/work/work_tools.nix` - [ ] Create `shared/modules/work/work_tools_home.nix` ### 2. Import in nate-work system configuration In `nate-work/desktop-configuration.nix`: ```nix imports = [ # ... existing imports ../shared/modules/work/work_tools.nix ]; config = { # ... existing config work_tools = { enable = true; enableDocker = true; enableVirtualization = true; enableGoTools = true; enableNodeTools = true; enableDatabaseTools = true; user = deskCfg.userName; }; }; ``` ### 3. Import in nate-work home-manager configuration In `nate-work/modules/home-manager/home.nix`: ```nix imports = [ # ... existing imports ../../../shared/modules/work/work_tools_home.nix ]; work_tools_home = { enable = true; enableGoTools = true; enableNodeTools = true; enableDatabaseTools = true; enableAwsTools = true; }; ``` ### 4. Remove work packages from nirihome.homePackages Clean up the existing package list by removing packages now provided by work_tools_home. ### 5. Test the configuration ```bash # Dry-run to check for errors nix build .#nixosConfigurations.nate-work.config.system.build.toplevel --dry-run # If successful, rebuild sudo nixos-rebuild switch --flake .#nate-work ``` --- ## Benefits ### Modularity - Easy to enable/disable categories of tools - Can be reused across multiple work machines - Keeps personal configs clean ### Flexibility - Granular control via boolean flags - Can enable only needed tool categories - Easy to add new tool categories ### Maintainability - Single source of truth for work tools - Easier to update work tooling across systems - Clear separation of concerns --- ## Future Enhancements ### Additional Tool Categories ```nix enablePythonTools = lib.mkOption { type = lib.types.bool; default = false; description = "Enable Python development tools"; }; enableRustTools = lib.mkOption { type = lib.types.bool; default = false; description = "Enable Rust development toolchain"; }; enableCloudTools = lib.mkOption { type = lib.types.bool; default = false; description = "Enable cloud provider CLIs (Azure, GCP)"; }; ``` ### Company-Specific Customization ```nix company = lib.mkOption { type = lib.types.enum [ "vasion" "other" ]; default = "vasion"; description = "Company-specific tool configurations"; }; ``` ### Environment File Management Could integrate automated setup of `.vasion_env` or similar: ```nix work_tools_home.envFile = lib.mkOption { type = lib.types.nullOr lib.types.path; default = null; description = "Path to work environment variables file"; }; ``` --- ## Verification Checklist After creating the module: - [ ] Module imports correctly in desktop-configuration.nix - [ ] Module imports correctly in home.nix - [ ] Options can be toggled without errors - [ ] Docker service starts correctly - [ ] Libvirtd service starts correctly - [ ] Go tools are in PATH - [ ] Node tools are in PATH - [ ] AWS CLI works - [ ] User is in correct groups (docker, libvirtd) - [ ] No duplicate packages between work_tools and personal configs - [ ] Build succeeds with `nix flake check` - [ ] System rebuilds successfully --- ## Migration Path ### Current State (nate-work) Work tools scattered across: - `nate-work/modules/niri/niri_conf.nix` (docker, virt-manager) - `nate-work/modules/home-manager/home.nix` (go, node, aws tools) ### Target State Work tools consolidated in: - `shared/modules/work/work_tools.nix` (system-level) - `shared/modules/work/work_tools_home.nix` (user-level) ### Steps 1. Create module files 2. Import modules 3. Enable with appropriate flags 4. Remove duplicate package declarations 5. Test rebuild 6. Verify all tools still work 7. Commit changes --- ## Questions to Answer Before implementing: 1. **Should this be in `shared/` or `nate-work/modules/`?** - Recommendation: `shared/` if you might have multiple work machines - Use `nate-work/modules/` if this is Vasion-specific 2. **Do you want separate modules per tool category?** - Could split into: `work_docker.nix`, `work_go.nix`, etc. - Tradeoff: More files vs. better separation 3. **Should work tools include LSPs?** - Currently LSPs are in home.nix - Could move to work_tools_home for consistency 4. **Do you want cloud-specific tool categories?** - AWS tools separate from GCP/Azure? - Or generic "cloud tools" category? 5. **Should VPN proxy module be part of work_tools?** - Currently separate module - Could integrate or keep separate