diff --git a/.dockerignore b/.dockerignore index 2f39eb088..1952082f1 100644 --- a/.dockerignore +++ b/.dockerignore @@ -30,6 +30,13 @@ coverage server/temp/media/* server/temp/output/* +# Headless scratch / outputs / sample workspace (rebuilt or not needed in image) +headless/output +headless/assets +tmp-workspace +tmp +*.mp4 + # Git .git .gitignore diff --git a/.gitignore b/.gitignore index 0c5e613dc..b97d90135 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,12 @@ crates/*/Cargo.lock tmp +# Headless render harness: generated outputs, test assets, scratch workspaces. +# (The harness source — headless/*.mjs, src/headless/ — is committed.) +headless/output/ +headless/assets/ +tmp-workspace/ + .vercel # FreeCut workspace artifacts, if the repo folder itself is picked as a diff --git a/CHANGELOG.md b/CHANGELOG.md index 591789f6b..aa8193659 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,36 @@ All notable changes to FreeCut. Weekly CalVer: `YYYY.MM.DD` = the Monday of the -## [Current] — week of 2026-05-18 +## [Current] — week of 2026-05-25 + +### Added +- In-app render queue — line up several exports and they render one after another, surviving a page refresh +- One-click quality presets in the export dialog +- Exports now save to a per-project folder, with a notice showing where files land +- Automatic caption styling, with per-item progress in the AI panel + +### Fixed +- Waveforms render from true audio peaks and stay sharp when zoomed in +- Waveforms no longer flash a skeleton when moving a clip to another track +- Preview no longer jumps when entering pen/path edit mode +- Preview stays continuous through transitions during playback +- Remaining placeholder strings are now translated across all 9 languages + +### Improved +- Much smoother timeline zooming and scrolling, especially with many clips on screen +- The editor stays responsive while audio loads — decoding now runs in the background + +## [2026.05.18] — week of 2026-05-18 to 2026-05-24 + +### Added +- Hold (stepped) interpolation for keyframes +- Language switcher on the projects page, with more panels translated (text tools, transitions, scene browser) ### Fixed - Rotated videos display the correct orientation in skim preview and exports - Scrub overlay stays aligned and the skim indicator sits flush on clip edges +- Transitions on same-clip (A-A) splits now render correctly +- Splitting a reversed clip keeps both halves continuous ### Improved - Filmstrips and waveforms render smoother while zooming the timeline diff --git a/headless.html b/headless.html new file mode 100644 index 000000000..caa5d9ee5 --- /dev/null +++ b/headless.html @@ -0,0 +1,12 @@ + + +
+ + +` | `high` | `low \| medium \| high \| ultra` (controls bitrate). | +| `--in` | 0 | Render range start (seconds). | +| `--out-sec ` | end | Render range end (seconds). | +| `--duration ` | — | Render this many seconds from `--in`. | +| `--audio-only` | off | Render audio only. | +| `--build` | off | Build `dist/` first if the harness isn't built. | +| `--head` | off | Run a visible browser for debugging. | +| `--harness-url ` | — | Dev mode: drive a running `npm run dev` server instead of `dist/`. | + +## Notes & limitations + +- **Media must be mirrored to the workspace folder on disk.** The CLI reads + `media/ / `. If a media source is missing (imported but never read in + the app), open the project in FreeCut once so it's mirrored, then re-run. +- **Codec support is verified at render time** and falls back the same way the + app does (e.g. H.264 → VP9 if unavailable). Headless Chrome here supports + H.264/HEVC/VP9/AV1 video and AAC/Opus audio with hardware WebGPU. +- **Audio codecs:** AAC/MP3/Opus/Vorbis/FLAC/PCM decode natively; **AC-3/E-AC-3 + (Dolby Digital / DD+) decode via `@mediabunny/ac3`** — the CLI passes each + media's `metadata.json` to the harness, which seeds the media-library store so + the codec is recognized and the AC-3 decoder is registered. Truly exotic + codecs (e.g. DTS) still can't be decoded headlessly; the CLI warns and that + audio is silent (video unaffected). Supporting those would need a Node-side + pre-decode (ffmpeg / `@mediabunny/server`) — not wired up since it needs a + heavy native dependency and is rarely needed. +- A harmless `Video load error` may log — that's the optional DOM `