{
  description = "NixOS configuration";

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

    catppuccin = {
      url = "github:catppuccin/nix";
    };
    home-manager = {
      url = "github:nix-community/home-manager/release-24.11";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    hyprpanel = {
      url = "github:Jas-SinghFSU/HyprPanel";
    };
    nixvim = {
      url = "github:nix-community/nixvim";
      inputs.nixpkgs.follows = "nixpkgs-unstable";
    };
    spicetify-nix = {
      url = "github:Gerg-L/spicetify-nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    zen-browser.url = "github:0xc000022070/zen-browser-flake";
    grayjay.url = "github:rishabh5321/grayjay-flake";
  };

  outputs =
    inputs@{
      self, # Get a ref to outputs
      nixpkgs,
      nixpkgs-unstable,
      home-manager,
      ...
    }:
    let
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
      inherit (self) outputs;
      common = import ./common.nix;
      theme = import ./theme.nix;
    in
    {
      defaultPackage.${system} = home-manager.defaultPackage.${system};

      # The minimum amount of dependencies in order to run 'just switch-now'
      devShells.${system}.default = pkgs.mkShell {
        packages = with pkgs; [
          just
          git
          git-crypt
          nh
        ];
      };

      # Adds the nix fmt command to format nix files
      formatter.${system} = pkgs.nixfmt-rfc-style;

      nixosConfigurations.${common.hostname} = nixpkgs.lib.nixosSystem {
        system = system;
        specialArgs = {
          inherit
            outputs
            inputs
            common
            theme
            ;
        }; # 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 common theme; };
              users.${common.username} = import ./home-manager;
            };
          }
          ./overlays.nix
        ];
      };

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