Nodes/kubakub nodes/kubakub burn in
ComfyUI Node

kubakub burn in

Timecode on every frame so you can actually talk about frame 738

By kubakubkub·Created about a month ago·Updated 3 days ago· 10
kubakub burn in
  • images
  • images
◄text{name} {frame} {timecode}►
◄name►
◄fps25.000►
◄start_frame0►
◄positionbottom left►
◄size0.030►
◄opacity0.80►

What it's for

Review notes are worthless if nobody can say where. "Around the middle, when the lights come up" costs you twenty minutes of scrubbing on a projector. "At 00:00:29:12" costs you one keypress.

kubakub burn in writes text onto every frame - frame number, timecode, project name, whatever you compose out of its four placeholders - so the review copy carries its own coordinates. It's the same job as a slate in a VFX pipeline, minus the clapperboard.

Use it for review copies. Not for the deliverable. It's burning pixels, and no amount of node-work downstream will get them back.

How it works

It writes a text string per frame into the image, over a dark box, at a position, size and opacity you choose. Because it runs over the whole batch and derives the frame number from the batch index plus start_frame, the same workflow produces a consistent slate whether your clip is 40 frames or 4000.

The text field is a template with four substitutions, and this is the part people miss:

  • {name} - whatever you wire into the name widget (link it from kubakub project settings so the whole node tree shares one project name).
  • {frame} - the frame number as five digits, counted from start_frame.
  • {timecode} - hh:mm:ss:ff, computed from fps and the frame number.
  • {total} - the frame count of the batch.

So "{name} {frame} {timecode}", the default, gets you a project name, a frame number and a timecode on a dark strip in the corner.

Inputs and outputs

  • images - the frames to write on.
  • text - the template above. Multiline, so you can stack lines if you want something bigger than a corner stamp.
  • name - the project name, empty by default. Wire it, don't retype it.
  • fps - 1 to 120, default 25. Only feeds {timecode}.
  • start_frame - the number of the first frame. Set it to match your timeline so the numbers on screen match the numbers in the notes. This is the field that makes timecode useful rather than decorative.
  • position - bottom left, bottom right, bottom centre, top left, top right, top centre.
  • size - text height as a share of the frame height, default 0.03. Share rather than pixels, so it scales with the matrix.
  • opacity - how solid the text and its dark box are, 0.1 to 1, default 0.8.

One output, images. Straight to kubakub export video / frames - pick the preview format if it's going to a client over email.

Install

Manager → search kubakub nodes → install → restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/kubakubkub/ComfyUI_KubaNodes
python -m pip install -r ComfyUI_KubaNodes/requirements.txt

ComfyUI 0.37.0 or newer; the only added package is opencv-python-headless (keep your existing OpenCV). This node needs no models, no Blender and no ffmpeg - it's pure pixel writing.

Common issues

  • Timecode is wrong. fps is rounded to whole frames per second for {timecode}. If you're delivering 29.97 you'll see a drift between the burnt-in timecode and a proper 29.97 timecode; it's precise enough for review notes, not for editorial conform.
  • Numbers start at 00000. Set start_frame to the actual first frame of the shot.
  • Text is unreadably small at 4K. size is a share of frame height, so 0.03 on a 2160-tall matrix is about 65px - fine at 1080p review, tiny if you're reviewing the full-size file from across the room. Bump it.
  • It's baked in. If the client then asks for a clean copy, you re-run the export with the node bypassed. Keep burn-in as the last node on a branch rather than in the middle of your chain.
Categorykubakub/2d/post

Inputs (8)

NameTypeDefaultDescription
imagesIMAGEThe frames to write on.
textSTRING{name} {frame} {timecode}{name}, {frame} (from start_frame), {timecode} (hh:mm:ss:ff), {total} = frame count.
nameSTRINGLink it from project settings.
fpsFLOAT25.0001–120Frames per second, for {timecode} (rounded to whole frames per second).
start_frameINT00–10000000The frame number of the first frame; {frame} and {timecode} count from it.
positionCOMBObottom leftWhere on the frame the text box sits.
sizeFLOAT0.0300.005–0.2Text height as a share of the frame height.
opacityFLOAT0.800.1–1How solid the text and its dark box are: 1 = solid, 0.1 = faint.

Outputs (1)

NameTypeDescription
imagesIMAGE—