{
  description = "Jo's NixOS configuration";

  inputs = {
    # Nixpkgs instance.
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";

    # Snowfall lib imposes an opinionated file-structure, which makes things a little easier sometimes.
    snowfall-lib = {
      url = "github:snowfallorg/lib";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # Home manager for managing the /home directory.
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # Hardware specific tweaks and performance optimizations.
    hardware.url = "github:NixOS/nixos-hardware/master";

    # Catppuccin theme nix configuration.
    catppuccin.url = "github:catppuccin/nix";

    # Declarative management of Flatpak packages.
    nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.4.1";
  };

  outputs = inputs:
    inputs.snowfall-lib.mkFlake {
      inherit inputs; # Providing flake inputs to Snowfall Lib.
      src = ./.; # "src" must point to the root of the flake.

      snowfall = {
        # "root" can be used, to tell Snowfall Lib where to look for Nix files.
        # root = ./nix;

        # Namespace for this flake's packages, library and overlays.
        namespace = "puzzlevision";

        meta = {
          name = "jos-nixos-configuration"; # Used in certain places, like documentations. No spaces.
          title = "Jo's NixOS configuration"; # Basically just for decorational purposes.
        };
      };

      channels-config = {
        allowUnfree = true; # Allow unfree packages.
      };

      # Apply some home-manager modules globally.
      homes.modules = with inputs; [
        nix-flatpak.homeManagerModules.nix-flatpak
      ];

      homes.users."jo@puzzlevision".modules = with inputs; [
        catppuccin.homeManagerModules.catppuccin
      ];
    };
}