dutchcoders/transfer.sh · critical

Provider not set or invalid.

Error message

Provider not set or invalid.

What it means

This error is thrown by the transfer.sh CLI startup when the value of the --provider flag does not match any of the supported storage backends (s3, gdrive, storj, local). The switch statement in cmd/cmd.go falls through to its default branch, aborting server startup. It means no valid storage provider was configured, so the server cannot store uploads.

Source

Thrown at cmd/cmd.go:531

			if access := c.String("storj-access"); access == "" {
				return errors.New("storj-access not set.")
			} else if bucket := c.String("storj-bucket"); bucket == "" {
				return errors.New("storj-bucket not set.")
			} else if store, err := storage.NewStorjStorage(c.Context, access, bucket, purgeDays, logger); err != nil {
				return err
			} else {
				options = append(options, server.UseStorage(store))
			}
		case "local":
			if v := c.String("basedir"); v == "" {
				return errors.New("basedir not set.")
			} else if store, err := storage.NewLocalStorage(v, logger); err != nil {
				return err
			} else {
				options = append(options, server.UseStorage(store))
			}
		default:
			return errors.New("Provider not set or invalid.")
		}

		srvr, err := server.New(
			options...,
		)

		if err != nil {
			logger.Println(color.RedString("Error starting server: %s", err.Error()))
			return err
		}

		srvr.Run()
		return nil
	}

	return &Cmd{
		App: app,
	}

View on GitHub (pinned to c37bfd9579)

Solutions

  1. Set --provider to one of the exact lowercase values: s3, gdrive, storj, or local.
  2. If using local storage, also pass --basedir pointing to a writable directory; for s3 also pass aws-access-key, aws-secret-key, and bucket.
  3. Check your environment variables or config file feeding the flag for typos or trailing whitespace (e.g. PROVIDER=s3 ).
  4. Upgrade to a version that supports your intended backend, or verify the provider name against the documented flag list (transfer.sh --help).

Example fix

// before
transfer.sh --provider=S3 --aws-access-key ... 
// after
transfer.sh --provider s3 --aws-access-key ... --aws-secret-key ... --bucket mybucket
Defensive patterns

Strategy: validation

Validate before calling

case os.Getenv("PROVIDER"), providerFlag := ""
// shell check before launch:
// [ "$PROVIDER" = "s3" ] || [ "$PROVIDER" = "gdrive" ] || [ "$PROVIDER" = "storj" ] || [ "$PROVIDER" = "local" ] || { echo "invalid provider"; exit 1; }

Type guard

func validProvider(p string) bool {
	switch p {
	case "s3", "gdrive", "storj", "local":
		return true
	}
	return false
}

Prevention

When it happens

Trigger: Running the server with --provider set to a misspelled or unsupported value (e.g. --provider=S3, --provider=filesystem, or omitted entirely so it defaults to an empty/unrecognized string). Any value outside {s3, gdrive, storj, local} hits cmd/cmd.go:531.

Common situations: Typos in the provider flag, copying config from an older transfer.sh version that used a differently named provider (e.g. 's3' vs 'aws'), forgetting to set --provider in a systemd unit or Docker CMD, or case mismatch since the switch is case-sensitive.

Understand the failure class

Background: "environment variable is not set" and "Missing keys in environment" errors: what missing required env var messages mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of dutchcoders/transfer.sh@c37bfd9579 (2026-09-05). Data as JSON: /api/errors/1ac0cdf7958e0992. Report an issue: GitHub.