mariotyport
Kinetic title cards with real alpha, from a ComfyUI node that isn't AI at all
- export_path
- poster
- alpha_mask
- project_json
If you've ever generated footage in ComfyUI and then gone looking for a way to put words on it - real motion-graphics words, with timing, easing, and clean alpha for your editor - you know the gap. This node is that gap, closed. mariotyport (class MarioTyport) is a layered animated-typography studio that ships as a single ComfyUI output node: you build a timeline in a browser editor that opens right off the node, and it renders the whole thing to video locally. No checkpoint, no LoRA, no API key.
Worth knowing what it isn't: it's not another "text in an image" node - it's a mini After Effects for typography. Up to 60 text layers, keyframes, custom Bezier easing, nine canned treatments (Line reveal through Fade), and proper Arabic support via bundled Tajawal fonts with RTL shaping. This one shapes real text in Chromium rather than faking it glyph by glyph, so mixed-language headlines work too.
How it actually renders
The mechanism explains both the install and the speed. Run the node and it launches a headless Chromium through Playwright, loads a small canvas engine bundled in the pack, and renders your project one frame at a time - screenshotting each frame and handing it to FFmpeg. Transparent MOV means ProRes 4444 with alpha bits; PNG sequence means numbered straight-alpha frames; MP4 composite is libx264 over a solid background or a footage file. Motion blur is multi-sample rendering in the same engine the studio preview uses, so preview matches export; the checkerboard behind previews is just the player background and never lands in your files.
A project is plain JSON - layers, keyframes, colors, and an optional soundtrack analyzed with librosa for beats, hits, and energy. That analysis drives audio-reactive layers, synced to detected beats or, with an optional offline Demucs install, drum/bass/vocal stems. All local. The node is an output node, so ComfyUI runs it every queue pass rather than caching it away - correct for something that must export fresh video.
The inputs that matter
Most of the schema is settings you can ignore at first:
- text / font / animation - type a headline, pick a Tajawal weight and a preset, and the node builds a default project around them. Never open the studio and this is all you touch.
- format - Transparent MOV (alpha for an NLE), PNG sequence, or MP4 composite. Note: the transparent options export only the typography, never any footage reference - footage and solid backgrounds belong in MP4 composite.
- project_json - the studio's soul. When filled, it overrides text/font/animation/duration entirely.
Below those, width/height/fps/duration are as expected, and video_file supplies footage for the MP4 composite - relative paths resolve against ComfyUI/input, absolute paths work too.
Outputs: export_path (the rendered file or sequence folder), poster (an IMAGE from about half a second in, composited over a solid so it isn't transparent), alpha_mask (a MASK of that frame's alpha - white is opaque), and project_json (the exact validated project that rendered). Wire poster and alpha_mask into preview or further processing; export_path feeds anything that wants a file path.
Install (the step everyone misses)
cd ComfyUI/custom_nodes
git clone https://github.com/mariobilly/msch-typort.git
Then install requirements with ComfyUI's own Python, not your system Python. Windows portable:
.\python_embeded\python.exe -m pip install -r .\ComfyUI\custom_nodes\msch-typort\requirements.txt
…and then the non-negotiable extra step:
python -m playwright install chromium
That downloads the headless Chromium the renderer drives. Skip it and every export dies with an error telling you exactly what to run. Optional instrument separation (drums/bass/vocals) ships in requirements-stems.txt; install it with --no-deps so it doesn't replace your torch. Restart ComfyUI and hard-refresh the browser. Registry listing was still pending as of this writing, so git install is the reliable route for now.
Gotchas worth knowing
Heads-up: this standalone repo is superseded by the author's unified pack, msch-comfyui-nodes - one install for the whole MSCH collection. Existing installs are kept alive but new nodes land there; follow its migration guide before switching and keep only one copy installed or you'll hit duplicate node registrations.
Beyond that, failures are mostly environment-shaped: Playwright installed into the wrong interpreter (same Python as ComfyUI, always), and soundtracks that must live in ComfyUI/input - re-upload them if you move the workflow to another machine. The pack fingerprints analyzed audio, so swap the file and it refuses to render until you re-analyze in the studio. And set expectations on speed: every frame is a headless-browser screenshot plus encode, so a five-second 1080p clip is 150 frames of work and 4K jobs eat disk. It's an 8-bit SDR canvas renderer too; the ProRes wrapper doesn't make it HDR. For layered, keyframed, audio-synced typography with clean alpha, this is the one I'd reach for; just don't ask it to be a whole NLE.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | MAKE IT MATTER | — |
| font | COMBO | 7 options: Black, ExtraBold, Bold, Medium, Regular, Light, +1 | |
| animation | COMBO | 9 options: Line reveal, Word cascade, Scale impact, Editorial drift, Side sweep, Tracking reveal, +3 | |
| duration | FLOAT | 5.00.1–600 | — |
| width | INT | 192064–4096 | — |
| height | INT | 108064–4096 | — |
| fps | INT | 301–60 | — |
| format | COMBO | 3 options: Transparent MOV, PNG sequence, MP4 composite | |
| motion_blur | COMBO | 3 samples | 3 options: Off, 3 samples, 5 samples |
| video_file | STRING | — | |
| project_json | STRING | — | |
| filename_prefix | STRING | mariotyport | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| export_path | STRING | — |
| poster | IMAGE | — |
| alpha_mask | MASK | — |
| project_json | STRING | — |