{
  description = "ParanaOS by GibbyDev";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-24.11";
    home-manager.url = "github:nix-community/home-manager";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";
    nur.url = "github:nix-community/NUR";
    stash.url = "github:NotAShelf/stash";
  };

  outputs = { self, nixpkgs, nixpkgs-stable, home-manager, nur, ... }@inputs:
    let
    lib = nixpkgs.lib;
  system = "x86_64-linux";

  customOverlays = builtins.attrValues (import ./overlays) ++ [
# Override kdenlive with stable version to work around ffmpeg shaderc issue
    (final: prev: {
     kdenlive = let
     stable = import nixpkgs-stable {
     inherit system;
     config.allowUnfree = true;
     };
     in stable.kdenlive;
     })
  ];

  pkgs = import nixpkgs {
    inherit system;
    overlays = customOverlays ++ [ nur.overlays.default ];
    config.allowUnfree = true;
  };

  src = lib.cleanSourceWith {
    src = ./.;
    filter = path: type:
      let baseName = lib.baseNameOf path;
    in baseName != ".git"
      && baseName != ".direnv"
      && baseName != "result";
  };

  hostDirs = lib.filter (h: h != "template") (builtins.attrNames (builtins.readDir ./hosts));

  mkHost = host:
    lib.nixosSystem {
      inherit system;

      specialArgs = {
        inherit inputs src;
      };

      modules = [
        ./hosts/${host}/configuration.nix

        {
          nixpkgs.overlays = customOverlays;
        }

      home-manager.nixosModules.home-manager
      {
        home-manager.useGlobalPkgs = true;
        home-manager.useUserPackages = true;
        home-manager.extraSpecialArgs = { inherit inputs src; };
      }
      ];
    };

  in
  {
    nixosConfigurations =
      builtins.listToAttrs (
          map (host: {
            name = host;
            value = mkHost host;
            }) hostDirs
          );

    devShells.${system} = {

      golang = pkgs.mkShell {
        name = "golang-shell";

# -----------------------
# Packages
# -----------------------
        buildInputs = with pkgs; [
          go         # Golang compiler & tooling
            git        # for cloning repos
            curl       # fetch templates/examples
            gnumake    # optional, for builds
            bash       # shell utilities
        ];

# -----------------------
# Shell setup
# -----------------------
        shellHook = ''
          echo ""
          echo "🚀 Golang dev shell ready"

# Ensure GOPATH/bin is in PATH
          export GOPATH=$HOME/go
          export PATH=$GOPATH/bin:$PATH

# Go modules enabled
          export GO111MODULE=on

# Preinstall templ if missing
          if [ ! -x "$GOPATH/bin/templ" ]; then
            echo "Installing Templ..."
              mkdir -p $GOPATH/src/github.com/evanw/templ
              cd $GOPATH/src/github.com/evanw
              git clone https://github.com/evanw/templ.git
              cd templ
              go install ./...
              cd -
              fi

              echo "Go version: $(go version)"
              echo "Templ location: $(command -v templ || echo 'not found')"
              echo "HTMX is front-end only: include <script src='https://unpkg.com/htmx.org@1.11.1'></script> in HTML"
              '';
      };


# -----------------------
# Jetzig dev shell
# -----------------------
      jetzig = pkgs.mkShell {
        name = "jetzig-shell";

        buildInputs = with pkgs; [
          zig
            git
            gnumake
            pkg-config
            openssl
        ];

        shellHook = ''
          echo ""
          echo "🚀 Jetzig dev shell ready"

          export JETZIG_HOME=$HOME/.jetzig
          export ZIG_GLOBAL_CACHE_DIR=$HOME/.cache/zig
          export PATH=$JETZIG_HOME/zig-out/bin:$PATH

# Clone if missing
          if [ ! -d "$JETZIG_HOME" ]; then
            echo "Cloning Jetzig into $JETZIG_HOME ..."
              git clone https://github.com/jetzig-framework/jetzig $JETZIG_HOME
              fi

# Build if not built yet
              if [ ! -f "$JETZIG_HOME/zig-out/bin/jetzig" ]; then
                echo "Building Jetzig..."
                  cd $JETZIG_HOME
                  zig build -Doptimize=ReleaseSafe
                  cd -
                  fi

                  echo "jetzig location: $(command -v jetzig || echo 'not found')"
                  '';
      };

# -----------------------
# MERN dev shell
# -----------------------
      mern = pkgs.mkShell {
        name = "mern-shell";

        buildInputs = with pkgs; [
          nodejs
            yarn
            mongodb-tools
            git
            curl
            openssl
            gnumake
        ];

        shellHook = ''
          echo ""
          echo "🚀 MERN dev shell ready"

# Local node_modules bin
          export PATH=$(pwd)/node_modules/.bin:$PATH

# Default MongoDB URL
          export MONGO_URL="mongodb://localhost:27017"

          echo "Node.js version: $(node -v)"
          echo "npm version: $(npm -v)"
          echo "MongoDB tools available: $(which mongo || echo 'not found')"
          '';
      };

# -----------------------
# Flutter dev shell
# -----------------------
      flutter = pkgs.mkShell {
        name = "flutter-shell";

        buildInputs = with pkgs; [
          flutter
            dart
            android-tools
            jdk21
            kotlin
            gradle
        ];

        shellHook = ''
          echo ""
          echo "🚀 Flutter dev shell ready"
          echo ""

          export ANDROID_HOME="$HOME/Android/Sdk"
          export ANDROID_SDK_ROOT="$HOME/Android/Sdk"

          echo "Flutter version: $(flutter --version)"
          echo "Dart version: $(dart --version)"
          echo "Android tools: adb, fastboot available"
          echo ""
          echo "Next steps:"
          echo "  • flutter doctor (check setup)"
          echo "  • flutter create my_app"
          echo "  • cd my_app && flutter run"
          '';
      };
    };
  };
}
