- images
- transcription
- images
- transcription_framestamps
font2img is the original all-in-one text-animation node from Mana Nodes - the one that put this pack on the map. Give it text and it renders a batch of frames with that text drawn, styled, and animated, ready to hand off to a video combiner. It's the ancestor of everything else in the pack: the styling, canvas, and animation controls that now live in separate nodes were all crammed into this single monster node first.
Why it's a big deal (and why it got split up)
If you've seen the Mana Nodes demos - words scaling and rotating and color-cycling over an AnimateDiff loop - font2img is the node that drew them. The appeal is that it does the whole typography job in one place: pick a font, pick colors, set a start and end size, a start and end rotation, an easing curve, and it interpolates the animation across your frames for you.
The flip side is that "one place" means a wall of maybe thirty widgets. That's exactly why the author later refactored it into modular pieces - Font Properties for the typeface, Canvas Properties for the background, Scheduled Values and Preset Color Animations for the animation, all feeding a slimmer Text to Image Generator. So font2img is the older name. If you installed the pack recently you'll more likely reach for the modular chain, but plenty of tutorials and shared workflows still wire up font2img, so it's worth understanding.
The inputs that matter
Everything's baked in, so the widget list is long, but only a handful actually shape the result:
text- multiline. Your words. Supports a per-frame syntax so you can time text changes.font_file- a dropdown of the ~30 fonts that ship with the pack (AURORA-PRO, DejaVu, Montserrat, a few grungy display faces).image_width/image_height- canvas size, default 512×512.frame_count- how many frames to render; this is the length of your animation.transcription_mode-word,line, orfill. Controls how text is chunked onto the canvas, which matters most when you feed it a transcription.
Then the animation block: start_font_size/end_font_size, start_x_offset/end_x_offset (and the y equivalents), start_rotation/end_rotation, an animation_easing curve (linear, exponential, elastic, bounce, and friends), animation_duration, and animation_reset (word/line/never - whether the animation restarts on each new word). You set a from-value and a to-value and the node tweens between them.
Optional inputs: images to render text over an existing frame sequence instead of a solid background, and transcription to accept timed text from a Speech Recognition node.
Outputs are images (the rendered IMAGE batch) and transcription_framestamps - the timed text as a string you can save, hand-correct, and paste back in.
Installing it
It comes with the pack. ComfyUI Manager → search Mana Nodes → install → restart. Or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/ForeignGods/ComfyUI-Mana-Nodes.git
Install the requirements (pip install -r requirements.txt in your venv, or the python_embed variant on Windows portable) and restart. Text rendering leans on Pillow; the bundled fonts live in the pack's font_files directory.
Common issues
The big one is version confusion. Because the pack moved to the modular Font/Canvas/Generator design, a fresh install may not show a node literally called font2img - or it'll behave differently than a two-year-old tutorial expects. If a workflow you downloaded references font2img and won't load, you're looking at a version mismatch; rebuild it with the current nodes.
Beyond that: to use your own typeface, drop the .ttf/.otf into the pack's font_files folder and restart so it shows up in the dropdown. And non-Latin scripts are a known gap - the author lists better non-Latin support as a to-do, so don't expect clean CJK or Arabic rendering yet.
Inputs (33)
| Name | Type | Default | Description |
|---|---|---|---|
| font_file | COMBO | AURORA-PRO | 29 options: AURORA-PRO, Akira Expanded Demo, Another Danger - Demo, DejaVu Sans, DejaVu Sans Display, DejaVu Sans Mono, +23 |
| font_color | STRING | white | — |
| background_color | STRING | black | — |
| border_color | STRING | grey | — |
| border_width | INT | 0 | — |
| shadow_color | STRING | grey | — |
| shadow_offset_x | INT | 0 | — |
| shadow_offset_y | INT | 0 | — |
| line_spacing | INT | 5 | — |
| kerning | INT | 0 | — |
| padding | INT | 0 | — |
| frame_count | INT | 11–10000 | — |
| image_height | INT | 512 | — |
| image_width | INT | 512 | — |
| rotation_anchor_x | INT | 0 | — |
| rotation_anchor_y | INT | 0 | — |
| transcription_mode | COMBO | fill | 3 options: word, line, fill |
| text_alignment | COMBO | center center | 9 options: left top, left center, left bottom, center top, center center, center bottom, +3 |
| text_interpolation_options | COMBO | cumulative | 3 options: strict, interpolation, cumulative |
| text | STRING | — | |
| animation_reset | COMBO | word | 3 options: word, line, never |
| animation_easing | COMBO | linear | 10 options: linear, exponential, quadratic, cubic, elastic, bounce, +4 |
| animation_duration | INT | 10 | — |
| start_font_size | INT | 75 | — |
| end_font_size | INT | 75 | — |
| start_x_offset | INT | 0 | — |
| end_x_offset | INT | 0 | — |
| start_y_offset | INT | 0 | — |
| end_y_offset | INT | 0 | — |
| start_rotation | INT | 0-360–360 | — |
| end_rotation | INT | 0-360–360 | — |
| imagesopt | IMAGE | — | |
| transcriptionopt | TRANSCRIPTION | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| transcription_framestamps | STRING | — |