{
  description = "NixOS configuration of Laurent Le Houerou";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.05";

    home-manager = {
      url = "github:nix-community/home-manager/master";
      inputs.nixpkgs.follows = "nixpkgs";   
    };
  };

  outputs = inputs @ { 
    self,
    nixpkgs, 
    home-manager, 
    ... 
  }: {
    
    # Common configuration function to reduce repetition
    nixosConfigurations = {
      # VM configuration
      nixos = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        specialArgs = inputs;
        modules = [
          # Base system configuration
          ./system/base
          
          # Desktop-specific configuration
          ./system/desktop
          
          # Machine-specific configuration
          ./machines/vm
          
          # Home-manager configuration
          home-manager.nixosModules.home-manager {
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
            home-manager.extraSpecialArgs = inputs;
            home-manager.users.laurent = { ... }: {
              imports = [
                # Base home configuration
                ./home/base
                
                # Desktop-specific home configuration
                ./home/desktop
              ];
            };
          }
        ];
      };
      
      # Desktop PC configuration
      desktop-pc = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        specialArgs = inputs;
        modules = [
          # Base system configuration
          ./system/base
          
          # Desktop-specific configuration
          ./system/desktop
          
          # Machine-specific configuration
          ./machines/desktop-pc
          
          # Home-manager configuration
          home-manager.nixosModules.home-manager {
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
            home-manager.extraSpecialArgs = inputs;
            home-manager.users.laurent = { ... }: {
              imports = [
                # Base home configuration
                ./home/base
                
                # Desktop-specific home configuration
                ./home/desktop
              ];
            };
          }
        ];
      };
      
      # Home server configuration
      home-server = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        specialArgs = inputs;
        modules = [
          # Base system configuration
          ./system/base
          
          # Server-specific configuration
          ./system/server
          
          # Machine-specific configuration
          ./machines/home-server
          
          # Home-manager configuration
          home-manager.nixosModules.home-manager {
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
            home-manager.extraSpecialArgs = inputs;
            home-manager.users.laurent = { ... }: {
              imports = [
                # Base home configuration
                ./home/base
                
                # Server-specific home configuration
                ./home/server
              ];
            };
          }
        ];
      };
    };
  };
}