Publish End Card
Drop a branded end card on a video you never rendered in an NLE
- background_image
- image
- end_card_info
Every video ends with a card: thanks for watching, follow for the next one, here's what else to check out. Normally that's an NLE or design-app job, which means breaking out of ComfyUI to make one static frame. MKRPublishEndCard renders the whole thing in the graph - title, subtitle, body, CTA, footer, on a themed background, with your generated image optionally sitting behind it. Bake it as the last frame of your render and your video ships with an outro it didn't need an editor for.
What it's for
It's the last-frame-of-the-video move in the pack's Publish lane. Feed it a finished render as background_image (or nothing, for a pure themed card), set the text, pick a theme, and out comes an IMAGE you can save or tack onto the end of your clip. It's also the natural companion to MKRPublishPromoFrame - the promo frame opens the video, the end card closes it.
How it works
Pure Pillow drawing. It creates a canvas at width × height (default 1080×1350 - a 4:5-ish portrait card), fills it from a theme palette, renders a themed background pattern, and draws the text block: title, subtitle, body, cta, footer, all inset by margin_px. Fonts auto-fit to the available space, and background_image gets fitted in behind the text. The four themes - Carbon, Paper, Signal, Blueprint - are flat color palettes, not templates; pick the one that matches your brand and move on.
Inputs and outputs
Inputs: width, height, title, subtitle, body, cta, footer, theme, margin_px, plus optional background_image. Outputs: image (the rendered IMAGE - wire it into a save or presave node) and end_card_info (a JSON string describing the card, handy for logging or a manifest).
Installing it
Pack install as always:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
restart ComfyUI, or Manager → MKRShift_Nodes. Pure PIL - no ffmpeg, no dependencies.
Common issues
Remember it renders to image as an IMAGE tensor - nothing is written to disk until you add a save node, and that trips people up on a node that feels like it "outputs a file." Also, the copy area is real but bounded: very long body text will crowd the card, so write tight. And the default 1080×1350 is a portrait card - if your video is 16:9 landscape, set width/height to match or the card won't sit right on the frame.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| width | INT | 1080256–4096 | — |
| height | INT | 1350256–4096 | — |
| title | STRING | Thanks for watching | — |
| subtitle | STRING | See the full drop in the next post | — |
| body | STRING | — | |
| cta | STRING | Follow for the next release | — |
| footer | STRING | MKRShift Nodes | — |
| theme | COMBO | Carbon | 4 options: Carbon, Paper, Signal, Blueprint |
| margin_px | INT | 6412–256 | — |
| background_imageopt | IMAGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| end_card_info | STRING | — |