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

  1. Switch the destination to a supported host (imgur, imageshack, flickr, chevereto, vgyme)
  2. Remove the photobucket destination entry from your config
  3. 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

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.