{
  description = "NixOS configuration";

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

    home-manager = {
      url = "github:nix-community/home-manager/release-24.11";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    nixvim = {
      url = "github:nix-community/nixvim";
      inputs.nixpkgs.follows = "nixpkgs-unstable";
    };
    stylix = {
      url = "github:danth/stylix/release-24.11";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs =
    inputs@{
      self, # Get a ref to outputs
      nixpkgs,
      nixpkgs-unstable,
      home-manager,
      stylix,
      ...
    }:
    let
      system = "x86_64-linux";
      inherit (self) outputs;
    in
    {
      # Adds the nix fmt command to format nix files
      formatter.${system} = nixpkgs.legacyPackages.${system}.nixfmt-rfc-style;

      nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
        system = system;
        specialArgs = { inherit outputs; }; # Pass args to modules
        modules = [
          ./configuration.nix
          home-manager.nixosModules.home-manager
          {
            home-manager = {
              # Backups conflicting files in case of error
              backupFileExtension = "bkp";
              useGlobalPkgs = true;
              useUserPackages = true;
              # Passes inputs as an argument to home-manager
              extraSpecialArgs = { inherit inputs; };
              users.martin = import ./home-manager;
            };
          }
          stylix.nixosModules.stylix
        ];
      };

      overlays = {
        # Gives access to unstable packages everywhere
        unstable-packages = final: _prev: {
          unstable = import nixpkgs-unstable {
            system = final.system;
            config.allowUnfree = true;
          };
        };
      };
    };
}