can1357/oh-my-pi · error · DestinationUnavailableError
the legacy upload API is decommissioned and third-party embe
Error message
the legacy upload API is decommissioned and third-party embedding is unavailable
What it means
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.
Source
Thrown at packages/coding-agent/src/blob-broker/uploaders-image-hosts.ts:374
});
},
};
}
/** Create a built-in image-host uploader, or `null` for another destination family. */
export function createImageHostUploader(
destination: BlobDestinationId,
config: DestinationRuntimeConfig,
): BlobUploader | null {
switch (destination) {
case "imgur":
return createImgurUploader(config);
case "imageshack":
return createImageShackUploader(config);
case "flickr":
return createFlickrUploader(config);
case "photobucket":
throw new DestinationUnavailableError(
destination,
"the legacy upload API is decommissioned and third-party embedding is unavailable",
);
case "chevereto":
return createCheveretoUploader(config);
case "vgyme":
return createVgymeUploader(config);
default:
return null;
}
}
View on GitHub (pinned to 9690622007)
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
Example fix
// before
{ "kind": "photobucket", "options": { "apiKey": "xxx" } }
// after
{ "kind": "imgur", "options": { "clientId": "xxx" } } Defensive patterns
Strategy: validation
Validate before calling
const SUPPORTED_HOSTS = ["imgur", "imageshack", "flickr", "chevereto", "vgyme"] as const;
if (!SUPPORTED_HOSTS.includes(dest.kind)) throw new Error(`${dest.kind} is not a supported image host`); Type guard
function isSupportedImageHost(kind: string): kind is SupportedImageHost {
return ["imgur", "imageshack", "flickr", "chevereto", "vgyme"].includes(kind);
} Try / catch
import { DestinationUnavailableError } from "./errors";
try {
const uploader = createImageHostUploader(config);
} catch (err) {
if (err instanceof DestinationUnavailableError) {
// migrate config to a supported host
}
throw err;
} Prevention
- 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
When it happens
Trigger: Configuring a blob destination with kind/host 'photobucket', which hits the photobucket case in createImageHostUploader and immediately throws.
Common situations: Migrating old configs that referenced photobucket, or trying photobucket as a free image host unaware the API was decommissioned years ago.
Related errors
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/9925f4c43381a45b.
Report an issue: GitHub.