{
  config,
  inputs,
  lib,
  pkgs,
  ...
}:
with lib; let
  cfg = config.custom.services.flatpak;
in {
  options.custom.services.flatpak.enable = mkOption {default = false;};

  config = mkIf cfg.enable {
    services.flatpak.enable = true;

    #!! Only takes effect if /usr/* shares do not exist
    # Nixpkgs workaround requires packages in the global environment
    # https://github.com/NixOS/nixpkgs/pull/262462
    environment.systemPackages =
      config.fonts.packages
      ++ [
        config.home-manager.users.${config.custom.username}.gtk.cursorTheme.package
        config.home-manager.users.${config.custom.username}.gtk.iconTheme.package
      ];

    home-manager.users.${config.custom.username} = {
      imports = [inputs.nix-flatpak.homeManagerModules.nix-flatpak];

      # https://wiki.nixos.org/wiki/Flatpak
      # https://github.com/gmodena/nix-flatpak
      services.flatpak = {
        enable = true;
        uninstallUnmanaged = true; # Immutable flatpaks
        update.auto.enable = true; # Auto update flatpaks weekly

        #!! Installation occurs during activation
        #?? flatpak search NAME
        packages =
          optionals config.custom.default [
            "com.github.tchx84.Flatseal" # Flatpak permissions editor
          ]
          ++ optionals config.custom.minimal [
            "net.retrodeck.retrodeck" # Game emulator
          ]
          ++ optionals config.custom.full [
            "app.drey.Biblioteca" # Documentation viewer
            "io.github.ronniedroid.concessio" # Permissions converter
            "re.sonny.Workbench" # GTK prototyper
          ];

        # https://github.com/gmodena/nix-flatpak?tab=readme-ov-file#overrides
        overrides.global = {
          Context.filesystems = [
            "xdg-config/gtk-3.0:ro"
            "xdg-config/gtk-4.0:ro"

            # HACK: Globally allow access to /nix/store for symlinked themes
            "/nix/store:ro"
          ];
        };
      };
    };
  };
}