Beeble Upload
Upload once, run a hundred SwitchX prompts — Beeble Upload
- source
- video
- beeble_uri
Every time you run a Beeble SwitchX node with a wired source, it uploads that source again. Fine for one shot. Wasteful when you're doing a prompt sweep - fifty variations off the same reference - because that's fifty uploads of the same bytes. Beeble Upload exists to break that loop: it pre-stages an asset on Beeble's storage once and hands you a beeble:// URI you can feed into as many SwitchX runs as you like.
The author's own framing is the right one: use it for batch/sweep workflows, for cached re-runs of the same workflow, and when you want the upload boundary explicit and visible. Don't use it for a single one-shot generation - the SwitchX node uploads internally, and adding a staging step is just extra graph for nothing.
The inputs
source(IMAGE, required) - the asset. A single still for image, a multi-frame batch for video. Same data shape as the SwitchXsource/alpha/reference_imageinputs.media_type(enum, defaultimage) - how to encode:imagewrites a PNG,videoencodes the frame batch as MP4 (libx264, yuv420p).filename(STRING, defaultinput.png) - mostly cosmetic; the extension is auto-corrected to.pngor.mp4to matchmedia_type, so it just shows up tidily on the Beeble dashboard.fps(FLOAT, default 24) - only used whenmedia_typeisvideo.video(optional VIDEO socket) - the modern path. If you're coming from a file-backed or lazy video pipeline (Topaz output, AM Read Video's VIDEO socket, an AM Pipe transform chain), wiring this uploads the underlying file directly - no IMAGE-batch materialisation, no uint8 re-encode, less RAM. When wired it forcesmedia_typetovideoand ignoressource.
The output
One socket, and it's the whole point: beeble_uri (STRING), a beeble://... URL. Take it and drop it into any SwitchX node's source_uri, reference_image_uri, or alpha_uri field instead of wiring the IMAGE again. The node's ComfyUI input cache also works in your favor: re-run the same workflow and it reuses the previous URI instead of re-uploading.
Mechanically it's the same two-step dance the SwitchX node does internally: encode locally, ask the API for a presigned upload URL, then PUT the bytes. You're not uploading to "a folder" - you're getting back a reference the Beeble API can fetch on demand.
Setup and gotchas
Install via ComfyUI Manager (comfyui-beeble-ai) or clone + pip install -r requirements.txt into ComfyUI/custom_nodes, restart, and set your key: BEEBLE_API_KEY env var, or api_key = "..." in ~/.config/comfyui-beeble-ai/config.toml (%APPDATA%\comfyui-beeble-ai\config.toml on Windows). No models, no heavy dependencies - the pack only pulls requests, imageio[ffmpeg], Pillow, and numpy.
Worth knowing: staging an upload doesn't cost generation credits, and the hard limits of the underlying API still apply downstream - a video upload beyond 240 frames or ~2.77M pixels will just fail at SwitchX time, so trim before you stage. And a beeble:// URI is only useful to the Beeble API; if you switch tools, the reference is meaningless. One more honest caveat, same as the rest of the pack: this is a self-serve MIT wrapper, not officially maintained, so budget for a fork if your pipeline depends on it.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| source | IMAGE | The source asset to upload. Single still for media_type='image' (PNG); multi-frame batch for media_type='video' (MP4). Same data shape as the Beeble SwitchX 'source' / 'alpha' / 'reference_image' inputs. | |
| media_type | COMBO | image | How to encode and upload the IMAGE input. 'image': single still, written as PNG. 'video': frame batch, encoded as MP4 (libx264, yuv420p). |
| filename | STRING | input.png | Filename hint sent to the API. Extension is auto-corrected to .png or .mp4 to match media_type, so this is mostly cosmetic for the Beeble dashboard. |
| fpsopt | FLOAT | 24.01–240 | Frames per second (only used when media_type='video'). |
| videoopt | VIDEO | Optional VIDEO input. When wired, this node uploads the underlying file directly (for `VideoFromFile` sources) or PyAV-encodes to a temp MP4 (for `VideoFromComponents` / lazy AM transform chains) — no IMAGE-batch materialisation, no re-encode from uint8. media_type is forced to 'video' and `source` is ignored. Wire this when upstream is Topaz Video Enhance, AM Read Video → VIDEO socket, or a lazy AM transform chain. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| beeble_uri | STRING | — |