Skip to content

Logo Bumper Video

Joseph Huckaby edited this page Jun 14, 2026 · 2 revisions

Build an AI Logo Bumper Workflow

This guide walks through building a xyOps workflow that turns a flat logo image into a short animated video bumper, adds a generated audio jingle, renders the final MP4, and uploads it to Amazon S3. Example final video:

Logo Bumper Video

The workflow uses five Marketplace Event Plugins:

Plugin Purpose
Image Converter Resizes the uploaded logo to a 1280x720 PNG with black padding.
Replicate AI Generation Plugin Generates the source video with the runwayml/gen-4.5 model.
ElevenLabs Audio Generates the bumper soundtrack with the Sound Effects model.
Video Toolkit Runs FFmpeg from a JSON spec to reverse, speed up, interpolate, pad, and mux the final video.
S3 Toolbox Uploads the finished MP4 to S3.

The finished graph has two parallel branches. One branch prepares the logo image and generates the video. The other branch generates the audio. A Join Controller waits for both branches, then Video Toolkit combines the two files and passes the final MP4 to S3.

Before You Start

Install the Marketplace Plugins listed above, then make sure their requirements are available on the workers where you will run them:

Plugin Requirement
Image Converter Docker available to xySat.
Video Toolkit Docker available to xySat, with FFmpeg supplied by the plugin image.
Replicate AI Generation Plugin Node.js, npx, and a Secret Vault variable named REPLICATE_API_TOKEN.
ElevenLabs Audio Node.js 18 or newer, npx, and a Secret Vault variable named ELEVENLABS_API_KEY.
S3 Toolbox Node.js, npx, and AWS credentials in Secret Vault, typically AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.

The workflow also needs one input file: the logo image. This should be a flat image, such as a PNG, JPEG, WebP, or GIF. Transparent logos are fine, because the first workflow step converts the input into a black-padded 1280x720 PNG.

For best results, use a source logo that is designed to be viewed on a dark or black background. Also note that if the smallest image dimension is less than 720 pixels, the Image Converter step will scale it up to fit the target frame.

Pricing Notes

This workflow uses hosted AI models, so each run has a real per-generation cost. Pricing can change, so check the Replicate model page and ElevenLabs Sound Effects pricing before running this at scale.

At the time of writing, the runwayml/gen-4.5 video model on Replicate is priced at $0.12 per second of output video. This workflow asks Replicate for a 5 second source clip, so the video generation step costs about $0.60 per successful run. That cost is based on the generated source clip length, not the shorter final animation after FFmpeg speeds it up.

ElevenLabs bills Sound Effects API usage in credits. For API users with an explicit duration, ElevenLabs currently lists the cost as 11 credits per second of sound effect duration. This workflow requests a 4 second audio cue, so the audio generation step costs about 44 ElevenLabs credits per successful run. The exact dollar value of those credits depends on your ElevenLabs plan or Pay As You Go balance.

In other words, expect each successful bumper to cost around $0.60 or so, plus ElevenLabs credits and any normal S3 storage or transfer costs. Also remember that retries, rejected generations, prompt experiments, and manual reruns can add up quickly, because each AI generation request may be billable.

Create the Workflow

Create a new workflow event named something like Logo Bumper.

Add a Manual Run trigger first. This gives you a normal authenticated way to test the workflow inside xyOps before exposing it through a Magic Link.

Then add a Max Input Files limit:

Setting Value
Enabled Yes
Maximum Files 1
Accepted File Types Leave blank, or restrict to image types if you prefer.

This keeps the workflow simple: one run, one uploaded logo, one final video.

Add Workflow User Fields

Add two workflow user fields. These are editable each time the workflow is launched manually, and they are also shown on the Magic Link landing page later.

Video Prompt

Setting Value
Type Text Box
ID video_prompt
Title Video Prompt
Default Value "Futuristic emblem vaporizes into glowing blue energy streams and particle vapor, plasma trails drifting through dark space, cinematic lighting, holographic disintegration effect. end with nothing left."

This prompt describes how the logo should be destroyed by the video model. That may sound backwards, but it is the first trick in this workflow.

AI video models are much better at starting with a clean logo frame and destroying it than they are at building a logo into a perfect final frame. So we ask the model to destroy the logo, then we reverse the video later. The finished result looks like the logo is assembling itself from nothing.

Audio Prompt

Setting Value
Type Text Box
ID audio_prompt
Title Audio Prompt
Default Value "Futuristic electronic logo bumper for a quick video outro, with a sharp click and rising synth beep pattern. Major key."

This prompt describes the audio bumper. The sound should be short, punchy, and timed like an ident or outro jingle.

These prompts are only starting points. You can change either one when you run the workflow. For example, the video prompt could ask for fire, smoke, glass shards, neon particles, metal dust, water, sand, holograms, or anything else that fits the brand.

Build the Video Branch

The video branch has two jobs:

  1. Prepare the uploaded logo image.
  2. Send the prepared image to Replicate AI Generation Plugin as the first frame for AI video generation.

Prep Logo Image

From the Manual Run trigger, solder a wire to a new Job Node using the Image Converter plugin. Set the node label to "Prep Logo Image" (or a label of your choice).

Configure the image parameters like this:

Setting Value
Resize Enabled Yes
Resize Width 1280
Resize Height 720
Resize Mode FitPad
Resize Background #000000
Resize Direction Both
Resize Gravity Center
Resize Antialias Best
Image Operation (None)
Output Format PNG
Output Quality 100
Output Append -output

The important pieces are 1280x720, black padding, 100% opacity, and PNG output.

The video model we are using expects this exact frame size for the source image. It also does not accept transparent input images, so the image sent to the model must be 100% opaque. FitPad keeps the full logo visible, preserves the logo aspect ratio, and fills the empty space with black.

Generate Video Track

From Prep Logo Image, solder a success wire to a new Job Node using the Replicate AI Generation Plugin. Set the node label to "Generate Video Track" (or a label of your choice).

Configure the Replicate AI Generation Plugin parameters like this:

Setting Value
Tool Generate Video
Replicate Model runwayml/gen-4.5
Prompt {{ workflow.params.video_prompt }}
Duration 5
Seed 0
Timeout (ms) 300000

Set the Custom JSON to:

{
	"aspect_ratio": "16:9",
	"image": "file:*"
}

The file:* placeholder tells the Replicate AI Generation Plugin to upload the first input file from the job and pass its URL to the model. Since this node receives the prepared PNG from the previous Image Converter node, the model uses the normalized logo image as its first frame.

The duration is set to 5 seconds because the model supports 5 or 10 second output, and 5 seconds is the shortest option. We will shorten it later with FFmpeg.

Build the Audio Branch

The audio branch starts from the same Manual Run trigger, but it runs in parallel with the video branch.

From the Manual Run trigger, solder a second wire to a new Job Node using the ElevenLabs Audio plugin. Set the node label to "Generate Audio Track" (or a label of your choice).

Configure the ElevenLabs Audio parameters like this:

Setting Value
Tool Sound Effects
Prompt {{ workflow.params.audio_prompt }}
Model ID eleven_text_to_sound_v2
Duration Seconds 4
Prompt Influence 0.33
Loop No
Count 1
Output Format mp3_44100_128
Timeout (ms) 240000

Use the Sound Effects tool, not the Music tool.

That is the second trick in this workflow. For short bumpers, hits, swells, stingers, risers, and logo jingles, the ElevenLabs Audio Sound Effects tool is a better fit than a general music model. The goal is not a song. The goal is a tight 4 second cue that lands cleanly with the logo reveal.

Join the Two Branches

Add a Join Controller to the workflow.

Solder both of these success wires into the Join Controller:

Source Node Wire Condition
Generate Video Track Success
Generate Audio Track Success

The Join Controller waits until both branches have finished. Then it concatenates the upstream files and passes them to the next node.

In this workflow, that means the next node receives:

This is the fan-out and fan-in point of the graph. After the Join Controller fires, the workflow is back on a single path.

Compose the Final Video

From the Join Controller, solder a wire to a new Job Node using the Video Toolkit plugin. Set the node label to "Compose Final Video" (or a label of your choice).

Set Dry Run to No, then paste this JSON into the Video Spec field:

{
	"inputs": [
		{
			"id": "video",
			"path": "*.mp4",
			"type": "video"
		},
		{
			"id": "music",
			"path": "*.mp3",
			"type": "audio"
		}
	],
	"streams": [
		{
			"id": "processed",
			"from": "video:v",
			"filters": [
				{
					"name": "reverse"
				},
				{
					"name": "fade",
					"options": {
						"t": "in",
						"st": 0,
						"n": 16
					}
				},
				{
					"name": "setpts",
					"expr": "0.5*PTS"
				},
				{
					"name": "minterpolate",
					"options": {
						"fps": 48,
						"mi_mode": "mci"
					}
				},
				{
					"name": "tpad",
					"options": {
						"stop_mode": "clone",
						"stop_duration": 60
					}
				}
			]
		}
	],
	"output": {
		"path": "final.mp4",
		"map": {
			"video": "processed",
			"audio": "music:a"
		},
		"video": {
			"codec": "libx264",
			"crf": 10,
			"preset": "slow"
		},
		"audio": {
			"codec": "aac",
			"bitrate": "192k"
		},
		"shortest": true,
		"faststart": true
	}
}

Here is what the spec does:

Step What It Does
*.mp4 input Finds the Replicate AI Generation Plugin video file passed through the Join Controller.
*.mp3 input Finds the ElevenLabs Audio audio file passed through the Join Controller.
reverse Reverses the AI video so the logo assembles instead of disintegrates.
fade Adds a short fade-in at the beginning of the reversed clip, hiding leftover non-black frames from the source generation.
setpts=0.5*PTS Halves the video duration, turning 5 seconds into about 2.5 seconds.
minterpolate=fps=48 Interpolates the source 24 FPS video up to 48 FPS.
tpad Freezes the final logo frame long enough for the audio to finish.
shortest Ends the file when the shortest mapped stream ends, which lets the 4 second audio cue set the final runtime.
faststart Optimizes the MP4 for web playback.

This is where the other two tricks happen.

First, the source AI video is reversed. The model starts from your finished logo and destroys it, but the final render plays that backwards, so it looks like the logo is being assembled from energy, particles, smoke, fire, or whatever your video prompt described.

The short fade-in is important because AI video models do not always end on a clean black frame. Sometimes the generated destruction clip leaves a few particles, haze, glow, logo fragments, or a partially lit background at the very end. After reversal, those imperfect ending frames become the beginning of the final bumper. The fade filter gently hides that by starting the reversed clip from black, so the first visible moment feels intentional instead of like a leftover artifact.

Second, the video is sped up while the frame rate is doubled. The source model outputs 5 seconds at 24 FPS, but a bumper usually wants a faster reveal. setpts=0.5*PTS compresses the animation to about 2.5 seconds, and minterpolate creates a smoother 48 FPS result.

The tpad filter freezes the final frame, which is the clean logo after reversal. Since the audio cue is 4 seconds, the animation finishes near the musical peak, then the final logo holds while the sound decays. This tends to feel intentional, even though both media tracks were generated independently.

Upload the MP4 to S3

From Compose Final Video, solder a success wire to a new Job Node using the S3 Toolbox plugin. Set the node label to "Upload to S3" (or a label of your choice).

Configure the S3 parameters like this, adjusting the region, bucket, and remote path for your own account:

Setting Example Value
Region ID us-west-1
Bucket Name my-video-bucket
Tool Upload Files
Local Path Leave blank (automatic)
Filename Pattern Leave blank
Remote Path videos/final-{{ id }}.mp4
Compress Files No
Custom S3 Params {}

Leaving Local Path blank is intentional. The S3 Toolbox plugin will upload files from the job temp directory, which is where xyOps places files passed from upstream workflow nodes. In this case, the upstream file is final.mp4 from Video Toolkit.

The {{ id }} macro in the Remote Path will inject the current Job ID, effectively giving the final uploaded file a unique filename in your S3 bucket (so you can generate as many videos as you want and they won't collide with each other).

If this bucket is intended for public web playback, you can use Custom S3 Params to set object metadata or ACLs, depending on your S3 bucket policy. For example:

{
	"ContentType": "video/mp4",
	"CacheControl": "public, max-age=86400"
}

Test the Workflow

Run the workflow manually first.

  1. Open the Logo Bumper workflow.
  2. Click Run Now.
  3. Upload one logo image.
  4. Review or edit the Video Prompt.
  5. Review or edit the Audio Prompt.
  6. Start the run and watch the workflow graph.

The Image Converter and ElevenLabs Audio nodes should start from the trigger in parallel. The Replicate AI Generation Plugin node should start after the prepared PNG is ready. The Join Controller should wait for both media generation branches. Then Video Toolkit should render final.mp4, and S3 Toolbox should upload it.

If the final timing feels too slow, make the video prompt more energetic, or keep the prompt and adjust the FFmpeg setpts value. For example, 0.4*PTS makes the reveal faster, while 0.6*PTS makes it slower. If the audio tail is too long or too short, adjust the ElevenLabs Audio duration.

Add a Magic Link

After the manual workflow is working, you can add a Magic Link trigger to create a standalone generation form.

In the workflow editor:

  1. Add a new Trigger Node.
  2. Choose Magic Link.
  3. Copy the custom landing page URL.
  4. Add any landing page Markdown you want.
  5. Solder the Magic Link trigger to the same two starting nodes as the Manual Run trigger:
    • Prep Logo Image
    • Generate Audio Track

This gives the Magic Link the same fan-out behavior as the manual trigger. Visitors to the landing page can upload a logo image, adjust the Video Prompt and Audio Prompt fields, and start the workflow without logging into xyOps.

The Magic Link landing page streams progress while the job runs, then shows the completed job result. Since the final workflow uploads the MP4 to S3, you can either show the normal job output, or customize the Magic Link body with a simpler completion message.

For example, the Magic Link body can include:

# Generate a Logo Bumper

Upload a flat logo image, adjust the prompts if needed, and start the workflow.

<!-- Button: Generate Bumper -->
<!-- Icon: video -->

If you want the page to return immediately while the workflow continues in the background, add a custom response comment:

<!-- Response: Your logo bumper is being generated. The finished MP4 will be uploaded to S3. -->

Recap

This workflow works well because each tool handles one focused part of the media pipeline:

  • Image Converter normalizes the uploaded logo into the exact first-frame shape the video model needs.
  • Replicate AI Generation Plugin generates a 5 second destruction animation from the logo frame.
  • ElevenLabs Audio generates a tight 4 second sound effect bumper.
  • Video Toolkit reverses the video, fades in from black, speeds it up, interpolates it to 48 FPS, freezes the final frame, and muxes the audio.
  • S3 Toolbox publishes the finished final.mp4.

The key idea is to let the AI models do what they are best at, then use deterministic FFmpeg transforms to shape the result into a polished bumper. Generate destruction, reverse it into assembly, fade away any imperfect starting artifacts, tighten the timing, add a short sound effect cue, and hold on the clean logo at the end.

Want to see one more fun example?

Logo Bumper Video

Clone this wiki locally