{"record":{"id":"9925f4c43381a45b","repo":"can1357/oh-my-pi","slug":"the-legacy-upload-api-is-decommissioned-and-third","errorCode":null,"errorMessage":"the legacy upload API is decommissioned and third-party embedding is unavailable","messagePattern":"the legacy upload API is decommissioned and third-party embedding is unavailable","errorType":"exception","errorClass":"DestinationUnavailableError","httpStatus":null,"severity":"error","filePath":"packages/coding-agent/src/blob-broker/uploaders-image-hosts.ts","lineNumber":374,"sourceCode":"\t\t\t});\n\t\t},\n\t};\n}\n\n/** Create a built-in image-host uploader, or `null` for another destination family. */\nexport function createImageHostUploader(\n\tdestination: BlobDestinationId,\n\tconfig: DestinationRuntimeConfig,\n): BlobUploader | null {\n\tswitch (destination) {\n\t\tcase \"imgur\":\n\t\t\treturn createImgurUploader(config);\n\t\tcase \"imageshack\":\n\t\t\treturn createImageShackUploader(config);\n\t\tcase \"flickr\":\n\t\t\treturn createFlickrUploader(config);\n\t\tcase \"photobucket\":\n\t\t\tthrow new DestinationUnavailableError(\n\t\t\t\tdestination,\n\t\t\t\t\"the legacy upload API is decommissioned and third-party embedding is unavailable\",\n\t\t\t);\n\t\tcase \"chevereto\":\n\t\t\treturn createCheveretoUploader(config);\n\t\tcase \"vgyme\":\n\t\t\treturn createVgymeUploader(config);\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n","sourceCodeStart":356,"sourceCodeEnd":386,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/coding-agent/src/blob-broker/uploaders-image-hosts.ts#L356-L386","documentation":"This is a DestinationUnavailableError, not a runtime failure: the 'photobucket' image host is intentionally disabled because Photobucket shut down its legacy third-party upload/embedding API. Selecting photobucket as a destination always fails with this message.","triggerScenarios":"Configuring a blob destination with kind/host 'photobucket', which hits the photobucket case in createImageHostUploader and immediately throws.","commonSituations":"Migrating old configs that referenced photobucket, or trying photobucket as a free image host unaware the API was decommissioned years ago.","solutions":["Switch the destination to a supported host (imgur, imageshack, flickr, chevereto, vgyme)","Remove the photobucket destination entry from your config","If you need self-hosted control, set up a Chevereto instance and point the chevereto destination at it"],"exampleFix":"// before\n{ \"kind\": \"photobucket\", \"options\": { \"apiKey\": \"xxx\" } }\n// after\n{ \"kind\": \"imgur\", \"options\": { \"clientId\": \"xxx\" } }","handlingStrategy":"validation","validationCode":"const SUPPORTED_HOSTS = [\"imgur\", \"imageshack\", \"flickr\", \"chevereto\", \"vgyme\"] as const;\nif (!SUPPORTED_HOSTS.includes(dest.kind)) throw new Error(`${dest.kind} is not a supported image host`);","typeGuard":"function isSupportedImageHost(kind: string): kind is SupportedImageHost {\n\treturn [\"imgur\", \"imageshack\", \"flickr\", \"chevereto\", \"vgyme\"].includes(kind);\n}","tryCatchPattern":"import { DestinationUnavailableError } from \"./errors\";\ntry {\n\tconst uploader = createImageHostUploader(config);\n} catch (err) {\n\tif (err instanceof DestinationUnavailableError) {\n\t\t// migrate config to a supported host\n\t}\n\tthrow err;\n}","preventionTips":["Never configure photobucket — its API is decommissioned","Validate destination kinds against the supported list at config load","Migrate legacy photobucket entries to imgur/chevereto","Surface DestinationUnavailableError clearly to users during config validation"],"tags":["photobucket","decommissioned","unsupported-destination"],"backgroundTag":"destination-decommissioned","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}