MP4 Comic Maker - Updates

I've been updating my new app:
https://github.com/tacyak8/HalfTone
It seems to be working okay? I think its much more useable now, and hopefully mostly self-explanatory once you click around and play with it.
ReadMe:
Halftone
A local motion-comic editor. Put generated stills on slides, add speech bubbles, cutouts and narrator boxes, time them with pauses, and export video. Everything runs on your machine; nothing goes to the internet.
Setup (once)
You need Python 3.10 or newer and ffmpeg.
pip install -r requirements.txt
python -m playwright install chromium
ffmpeg is a system install, not a pip package:
Windows:
winget install Gyan.FFmpeg, then open a new terminal so it's on your PATH.Linux (Debian/Ubuntu/Mint):
sudo apt install ffmpegFedora:
sudo dnf install ffmpeg(may need RPM Fusion enabled)
Check it with ffmpeg -version. If ffmpeg lives somewhere unusual, set HALFTONE_FFMPEG to its full path.
The starter fonts are already in fonts/. If that folder is ever missing, run python scripts/fetch_fonts.py to download them again.
Run
python run.py (or double-click start.bat on Windows)
It opens http://127.0.0.1:8765/ in your browser. It only listens on your own machine.
Options: --port 9000, --projects D:\Comics (keep projects somewhere else), --no-browser.
start.bat (Windows)
Double-click start.bat to start Halftone and open it.
Your own settings go in start-settings.bat: copy start-settings.example.bat to that name and edit it. It isn't part of the repository, so updating Halftone never overwrites it. You can:
not open a browser at all (
HALFTONE_OPEN_BROWSER=no), when another program such as your own browser shell opens Halftoneopen it in a specific browser (
HALFTONE_BROWSER= full path to the .exe)change the port (so a second copy can run at the same time) or the projects folder
If a .venv or venv folder exists next to it, start.bat uses that Python environment. Close the window to stop Halftone. Running start.bat again while Halftone is already running just opens it again.
Updating
If you installed with git clone, update with git pull in the Halftone folder. Your projects, assets and personal settings are not part of the repository, so they're left alone. Run pip install -r requirements.txt afterward in case new packages were added.
How it works
Each slide in the left column is a short list, read top to bottom:
Slide 3
Background (click: image, layout, panels, notes)
Opening pause 2 s
[bubble]
Pause 0 s
[bubble]
[cutout] (no pause between: appears together with the bubble above)
Pause 3 s
Transition: Fade 0.5 s (always last)
Pauses are the timing. A pause starts once everything above it has vanished, so
Pause 0 smeans "right after the previous one is gone."Assets with no pause between them appear together. Delete a pause to group the assets around it; hover between grouped assets and click + pause to split them again.
Every slide opens with a pause. A slide with no assets is just that pause.
Click an asset on the canvas or in the list to open its menu beside it: Timing (In / Hold / Out seconds and the In/Out transition styles), Text, Sound and Item (name, rotation, replace image). Hide puts the menu away; click the asset again to bring it back.
Any image asset can carry text: tick "Text on this asset" in its Text tab, and choose Speech or Narrator style. + Text box adds a plain narrator box.
Layouts: click the Background line to pick one of 12 panel layouts, or Single for one full image. Drop an image onto a panel to fill it, drag inside a panel to reposition, and scroll to zoom.
Export writes to
projects/<name>/exports/, with sound mixed in:MP4 for sharing
ProRes 422 HQ or DNxHR HQ .mov for DaVinci Resolve (use these on Linux, where free Resolve can't read H.264 or AAC)
Projects: open the project menu (top left) to Rename the current project or Save as copy.
Transitions
Each bubble, cutout or narrator box has an In and an Out style:
Fade
Wipe: left to right, right to left, top to bottom, or bottom to top
Unroll: opens from the middle outward
Roll in: closes in from the edges
Out plays the motion in reverse. For Wipe, Unroll and Roll in you can add a roller: an image (from assets/rollers) that rides the moving edge, like the rod of a scroll.
Slides change with Cut, Fade (set the time; optionally through black) or Page turn (fixed length, with an optional sound).
Text
When you add a bubble, Halftone guesses where its text should go by finding the largest area inside the bubble's body, away from the tail. Select the bubble and drag the amber Text tab to move the text anywhere, or drag the frame's corners to resize it. Reset frame puts it back. Double-click an asset to type in it.
Default fonts: in an asset's Text tab, Set as default makes new speech bubbles (or narrator text) start with that font, style and color. Project settings (the gear) also has default fonts.
Sound
Sounds in the list (+ Sound) take their turn like assets. Remove the pause above one to play it together with the asset above.
Attached sounds: any bubble, cutout or narrator box can play a sound as it appears. Drop a sound from the asset panel onto an element, or pick one in its settings.
Defaults: in Project settings (the gear), set a default sound for new bubbles, narrator boxes and page turns. Point it at a folder, such as
sounds/paper, and each new element gets a different take.Match In to sound sets an element's fade-in to the sound's length, so a paper unroll and an Unroll reveal finish together.
Canvas and keyboard
Do thisToDrag an elementMove itDrag a handleResize (images keep proportions; hold Shift to stretch)Double-click, or EnterEdit text in a bubble or narrator boxDrag the amber Text tabMove a bubble's text; drag the frame's corners to resize itDrag inside a panel / scrollReposition / zoom the panel's imageEscFinish typing, deselect, or leave previewArrow keys (Shift for 10 px)NudgeDeleteRemove the selected assetCtrl+DDuplicate the selected assetCtrl+Z / Ctrl+Shift+ZUndo / redoCtrl+SSave now (it also autosaves)SpacePlay / pause
Drop images from File Explorer onto the canvas and choose Bubble, Narrator or Cutout. Dropped onto a panel, an image fills it (hold Shift to add it as a cutout instead). Drop images onto a filmstrip slide to set its background, or onto "Add slide" to make one slide per image. An image already on a slide gets or loses its text with "Text on this asset" in its Text tab.
An amber dot on the bold or italic button means that font has no real bold or italic, so the style is simulated.
Assets
The assets folder is your kit. Subfolders appear as groups in the panel on the right:
FolderDropped on a slide it becomesbubblesa bubble, ready for textnarratora narrator box (bubble with narrator text style)cutoutsa cutoutbackgroundsthe slide background, or the panel you drop it onrollersthe roller for the element you drop it onsounds (and subfolders)a sound action, or an attached sound if dropped on an element
Make your own subfolders (for example sounds/paper or bubbles/shout) to keep things organized. To keep your kit somewhere else, such as next to your ComfyUI outputs, click the folder button on the asset panel and paste the folder's path. Halftone creates the standard subfolders there and remembers the choice in halftone-settings.json. The panel refreshes when you switch back to Halftone. Dropped assets are copied into the project, so projects stay self-contained.
Making your own bubbles
Halftone works best with bubbles that match your art.
Generate a sheet of bubbles with an image model in ComfyUI: one image with several empty speech bubbles, thought bubbles or caption boxes, spaced apart on a plain background. Ask for empty bubbles; Halftone adds the text. Make color or texture variants as separate sheets.
Remove the background with BiRefNet, so everything except the bubbles is transparent. Save as PNG.
Split the sheet: in the asset panel, click Split a bubble sheet… and add the PNG. Each shape is outlined and numbered. Click a box to skip it. If a tail or thought-bubble dots come out as separate pieces, raise Merge distance; if specks show up, raise Minimum size. Pick the folder and click Save.
Tips: leave clear space between bubbles on the sheet (touching bubbles come out as one piece), and generate several styles at once: normal, shout, whisper, thought, narrator.
Sounds for your kit
Good free sources whose licenses allow sharing the files: freesound.org (filter by license: Creative Commons 0), kenney.nl (CC0 packs) and opengameart.org (check each file). Record every sound in assets/sounds/CREDITS.md. Big "royalty free" bundles are usually fine to use in videos but not to redistribute inside an app.
Your own fonts
Put .ttf or .otf files in fonts/user/ and refresh the page. They show up under "Your fonts".