-
-
Notifications
You must be signed in to change notification settings - Fork 558
Logo Bumper Video
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:
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.
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.
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 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 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.
| 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.
| 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.
The video branch has two jobs:
- Prepare the uploaded logo image.
- Send the prepared image to Replicate AI Generation Plugin as the first frame for AI video generation.
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.
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.
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.
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:
- the MP4 generated by Replicate AI Generation Plugin
- the MP3 generated by ElevenLabs Audio
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.
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.
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"
}Run the workflow manually first.
- Open the
Logo Bumperworkflow. - Click Run Now.
- Upload one logo image.
- Review or edit the Video Prompt.
- Review or edit the Audio Prompt.
- 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.
After the manual workflow is working, you can add a Magic Link trigger to create a standalone generation form.
In the workflow editor:
- Add a new Trigger Node.
- Choose Magic Link.
- Copy the custom landing page URL.
- Add any landing page Markdown you want.
- 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. -->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?
