{
  description = "A simple NixOS flake";

  inputs = {
    # Primary package source - stable channel for system stability
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";

    # Home Manager - pinned to release-24.11 for compatibility
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    agenix.url = "github:ryantm/agenix";
    zen-browser.url = "github:0xc000022070/zen-browser-flake";
    # my private secrets, it's a private repository, you need to replace it with your own.
    # use ssh protocol to authenticate via ssh-agent/ssh-key, and shallow clone to save time
    mysecrets = {
      url = "git+ssh://git@gitlab.com/marvinroman/my-nixos-secrets?ref=main&shallow=1";
      flake = false;
    };

    # Optional, if you intend to follow nvf's obsidian-nvim input
    # you must also add it as a flake input.
    # obsidian-nvim.url = "github:epwalsh/obsidian.nvim";
    # obsidian-nvim.flake = false;

    # Required, nvf works best and only directly supports flakes
    nvf = {
      url = "github:notashelf/nvf";
      # You can override the input nixpkgs to follow your system's
      # instance of nixpkgs. This is safe to do as nvf does not depend
      # on a binary cache.
      inputs.nixpkgs.follows = "nixpkgs";
      # Optionally, you can also override individual plugins
      # for example:
      # inputs.obsidian-nvim.follows = "obsidian-nvim"; # <- this will use the obsidian-nvim from your inputs
    };
  };

  outputs =
    inputs@{
      self,
      nixpkgs,
      agenix,
      home-manager,
      ...
    }:
    {
      # Please replace toaster with your hostname
      nixosConfigurations = {
        toaster = nixpkgs.lib.nixosSystem rec {
          system = "x86_64-linux";
          modules = [
            # Import the previous configuration.nix we used,
            # so the old configuration file still takes effect
            ./hosts/toaster/default.nix
            home-manager.nixosModules.default
            {
              home-manager = {
                useUserPackages = true;
                useGlobalPkgs = true;
                users = {
                  "marvin" = import ./hosts/toaster/home.nix;
                };
                # Pass shared arguments to Home Manager modules
                extraSpecialArgs = {
                  inherit inputs;
                  hostName = "toaster";
                };
              };
            }
            agenix.nixosModules.default
            {
              # Set all inputs parameters as special arguments for all submodules,
              # so you can directly use all dependencies in inputs in submodules
              _module.args = {
                inherit inputs;
                inherit system;
              };
            }
          ];
        };
        baker = nixpkgs.lib.nixosSystem rec {
          system = "x86_64-linux";
          modules = [
            # Import the previous configuration.nix we used,
            # so the old configuration file still takes effect
            ./hosts/baker/default.nix
            home-manager.nixosModules.default
            {
              home-manager = {
                useUserPackages = true;
                useGlobalPkgs = true;
                users = {
                  "marvin" = import ./hosts/baker/home.nix;
                };
                # Pass shared arguments to Home Manager modules
                extraSpecialArgs = {
                  inherit inputs;
                  hostName = "baker";
                };
              };
            }
            agenix.nixosModules.default
            {
              # Set all inputs parameters as special arguments for all submodules,
              # so you can directly use all dependencies in inputs in submodules
              _module.args = {
                inherit inputs;
                inherit system;
              };
            }
          ];
        };
      };
    };
}