{"record":{"id":"f3e47a7d07dcd1c6","repo":"ipfs/kubo","slug":"cannot-remove-individual-bootstrap-peers-when-usin","errorCode":null,"errorMessage":"cannot remove individual bootstrap peers when using 'auto' placeholder: the 'auto' value is managed by AutoConf. Either disable AutoConf by setting AutoConf.Enabled=false and replace 'auto' with specific peer addresses, or use 'ipfs bootstrap rm --all' to remove all peers","messagePattern":"cannot remove individual bootstrap peers when using 'auto' placeholder: the 'auto' value is managed by AutoConf\\. Either disable AutoConf by setting AutoConf\\.Enabled=false and replace 'auto' with specific peer addresses, or use 'ipfs bootstrap rm --all' to remove all peers","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/commands/bootstrap.go","lineNumber":330,"sourceCode":"\t\tcfg.Bootstrap = append(cfg.Bootstrap, s)\n\t\taddedMap[s] = struct{}{}\n\t}\n\n\tif err := r.SetConfig(cfg); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn addedList, nil\n}\n\nfunc bootstrapRemove(r repo.Repo, cfg *config.Config, toRemove []string) ([]string, error) {\n\t// Check if bootstrap contains \"auto\"\n\thasAuto := slices.Contains(cfg.Bootstrap, config.AutoPlaceholder)\n\n\tif hasAuto && cfg.AutoConf.Enabled.WithDefault(config.DefaultAutoConfEnabled) {\n\t\t// Cannot selectively remove peers when using \"auto\" bootstrap\n\t\t// Users should either disable AutoConf or replace \"auto\" with specific peers\n\t\treturn nil, fmt.Errorf(\"cannot remove individual bootstrap peers when using 'auto' placeholder: the 'auto' value is managed by AutoConf. Either disable AutoConf by setting AutoConf.Enabled=false and replace 'auto' with specific peer addresses, or use 'ipfs bootstrap rm --all' to remove all peers\")\n\t}\n\n\t// Original logic for non-auto bootstrap\n\tremoved := make([]peer.AddrInfo, 0, len(toRemove))\n\tkeep := make([]peer.AddrInfo, 0, len(cfg.Bootstrap))\n\n\ttoRemoveAddr, err := config.ParseBootstrapPeers(toRemove)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttoRemoveMap := make(map[peer.ID][]ma.Multiaddr, len(toRemoveAddr))\n\tfor _, addr := range toRemoveAddr {\n\t\ttoRemoveMap[addr.ID] = addr.Addrs\n\t}\n\n\tpeers, err := cfg.BootstrapPeers()\n\tif err != nil {\n\t\treturn nil, err","sourceCodeStart":312,"sourceCodeEnd":348,"githubUrl":"https://github.com/ipfs/kubo/blob/329838acdfafae224582930457efe80aa217afc0/core/commands/bootstrap.go#L312-L348","documentation":"When the node's bootstrap list contains the \"auto\" placeholder and AutoConf is enabled, individual peer removal is not allowed because AutoConf manages that list. bootstrapRemove returns this error directing the user to either disable AutoConf and use explicit addresses, or remove everything with `ipfs bootstrap rm --all`.","triggerScenarios":"`ipfs bootstrap rm <addr>` (or multiple specific addresses) while `ipfs config Bootstrap` contains the \"auto\" placeholder and AutoConf.Enabled is true (or defaulted on).","commonSituations":"Operators on default AutoConf-managed setups trying to prune a bad peer; automation written for static bootstrap lists running against auto-managed nodes.","solutions":["Remove all peers at once: `ipfs bootstrap rm --all`, then add your static list","Disable AutoConf first: `ipfs config --json AutoConf.Enabled false`, replace `auto` with explicit addresses via `ipfs bootstrap add`, then remove individual peers","Use `ipfs bootstrap list` to confirm whether the list is auto-managed before scripting removals"],"exampleFix":"// before\nipfs bootstrap rm /ip4/1.2.3.4/tcp/4001/p2p/Qm...  # fails with auto list\n// after\nipfs bootstrap rm --all\nipfs bootstrap add /ip4/1.2.3.4/tcp/4001/p2p/Qm... # your static list","handlingStrategy":"validation","validationCode":"list, _ := exec.Command(\"ipfs\", \"bootstrap\", \"list\").Output()\nif strings.Contains(string(list), \"auto\") {\n    // auto-managed: use `ipfs bootstrap rm --all` or disable AutoConf first\n}","typeGuard":"null","tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"'auto' placeholder\") {\n    // fallback: rm --all then add the static list\n}","preventionTips":["Inspect `ipfs bootstrap list` before scripted removals","Prefer `bootstrap rm --all` + re-add for auto-managed nodes","Disable AutoConf deliberately when a static list is required","Keep one source of truth for bootstrap provisioning"],"tags":["cli","bootstrap","autoconf","config"],"backgroundTag":"operation-not-permitted-auto-managed","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"}