{"record":{"id":"404a866715790da1","repo":"ipfs/kubo","slug":"experimental-strategicproviding-was-removed-remov","errorCode":null,"errorMessage":"Experimental.StrategicProviding was removed. Remove it from your config. Documentation: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#strategic-providing","messagePattern":"Experimental\\.StrategicProviding was removed\\. Remove it from your config\\. Documentation: https://github\\.com/ipfs/kubo/blob/master/docs/experimental-features\\.md#strategic-providing","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/ipfs/kubo/daemon.go","lineNumber":980,"sourceCode":"\t\treturn errors.New(\"private network does not work with Routing.Type=auto. Update your config to Routing.Type=dht (or none, and do manual peering)\")\n\t}\n\n\t// Check for deprecated Provider/Reprovider configuration after migration.\n\t// This should never happen for regular users, but is useful error for people who have Docker orchestration\n\t// that blindly sets config keys (overriding automatic Kubo migration).\n\t//nolint:staticcheck // intentionally checking deprecated fields\n\tif cfg.Provider.Enabled != config.Default || !cfg.Provider.Strategy.IsDefault() || !cfg.Provider.WorkerCount.IsDefault() {\n\t\treturn errors.New(\"deprecated configuration detected. Manually migrate 'Provider' fields to 'Provide' and remove 'Provider' from your config. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#provide\")\n\t}\n\t//nolint:staticcheck // intentionally checking deprecated fields\n\tif !cfg.Reprovider.Interval.IsDefault() || !cfg.Reprovider.Strategy.IsDefault() {\n\t\treturn errors.New(\"deprecated configuration detected. Manually migrate 'Reprovider' fields to 'Provide': Reprovider.Strategy -> Provide.Strategy, Reprovider.Interval -> Provide.DHT.Interval. Remove 'Reprovider' from your config. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#provide\")\n\t}\n\tif cfg.Provide.Strategy.WithDefault(\"\") == \"flat\" {\n\t\treturn errors.New(\"Provide.Strategy='flat' is no longer supported. Use 'all' instead. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#providestrategy\")\n\t}\n\tif cfg.Experimental.StrategicProviding {\n\t\treturn errors.New(\"Experimental.StrategicProviding was removed. Remove it from your config. Documentation: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#strategic-providing\")\n\t}\n\tif cfg.Provide.DHT.SweepEnabled.WithDefault(config.DefaultProvideDHTSweepEnabled) &&\n\t\tcfg.Provide.DHT.MaxWorkers.WithDefault(config.DefaultProvideDHTMaxWorkers) == 0 {\n\t\treturn errors.New(\"invalid configuration: Provide.DHT.MaxWorkers cannot be 0 when Provide.DHT.SweepEnabled=true. Set Provide.DHT.MaxWorkers to a positive value (e.g., 16) to control resource usage. Documentation: https://github.com/ipfs/kubo/blob/master/docs/config.md#providedhtmaxworkers\")\n\t}\n\tif routingOption == routingOptionDelegatedKwd && cfg.Provide.Enabled.WithDefault(config.DefaultProvideEnabled) {\n\t\treturn errors.New(\"Routing.Type=delegated does not support content providing. Set Provide.Enabled=false in your config\")\n\t}\n\n\treturn nil\n}\n\nfunc validateDaemonEnvironment() error {\n\tif flag := os.Getenv(\"IPFS_REUSEPORT\"); flag != \"\" {\n\t\treturn errors.New(\"support for IPFS_REUSEPORT was removed. Use LIBP2P_TCP_REUSEPORT instead\")\n\t}\n\treturn nil\n}","sourceCodeStart":962,"sourceCodeEnd":998,"githubUrl":"https://github.com/ipfs/kubo/blob/329838acdfafae224582930457efe80aa217afc0/cmd/ipfs/kubo/daemon.go#L962-L998","documentation":"The Experimental.StrategicProviding flag was removed from Kubo entirely. validateDaemonConfig rejects it at startup instead of ignoring it silently, since the experimental feature no longer exists and the flag indicates a stale config from an older version.","triggerScenarios":"`ipfs daemon` with Experimental.StrategicProviding=true (or any value) present in the repo config, left over from a Kubo version that had the experiment.","commonSituations":"Upgrading nodes that once enabled the strategic-providing experiment; config snapshots carried forward across many versions.","solutions":["Remove the key: edit $IPFS_PATH/config and delete Experimental.StrategicProviding (or set/remove via `ipfs config --json Experimental.StrategicProviding` appropriately)","If strategic providing behavior is wanted, use the supported Provide.* options (docs/config.md#provide)","Review docs/experimental-features.md for the feature's status"],"exampleFix":"// before (config.json)\n\"Experimental\": { \"StrategicProviding\": true }\n\n// after\n\"Experimental\": {}   // key removed entirely","handlingStrategy":"validation","validationCode":"// detect stale experimental flags\njq -e '.Experimental.StrategicProviding != null' \"$IPFS_PATH/config\" \\\n  && echo \"Experimental.StrategicProviding removed; delete the key\"","typeGuard":null,"tryCatchPattern":"if err := daemonFunc(...); err != nil {\n    if strings.Contains(err.Error(), \"StrategicProviding was removed\") {\n        log.Fatalf(\"remove stale Experimental flag: %v\", err)\n    }\n}","preventionTips":["Prune Experimental.* keys after upgrades","Avoid enabling removed experiments in shared configs","Track Kubo changelogs for removed experimental features"],"tags":["config","deprecation","experimental-features"],"backgroundTag":"deprecated-config-key","analyzedSha":"329838acdfafae224582930457efe80aa217afc0","analyzedAt":"2026-09-03T18:30:52.135Z","contentChangedAt":"2026-09-03T18:30:52.135Z","schemaVersion":2},"datasetVersion":"2026-09-11T00:17:11.886Z"}