Skip to content

Releases

Reelsmith v0.3.1

Choose a tag to compare

@github-actions github-actions released this 11 Nov 10:18
0f4eb0e

What's Changed

  • perf: faster bounded clip-library discovery by @FranprzDev in #58
  • perf: reuse audio FIR and mastering ceiling calculations by @FranprzDev in #59
  • perf: reuse SVG definitions and frame document buffers by @FranprzDev in #60
  • perf: notify render waiters without half-second polling by @FranprzDev in #61
  • perf: avoid duplicate overlay metadata probes by @FranprzDev in #62
  • perf: batch caption QA screenshots with stream-safe fallback by @FranprzDev in #63
  • perf(audio): skip unused zero-wet convolution and impulse synthesis by @FranprzDev in #64
  • perf(synth): reuse boom saturation normalization by @FranprzDev in #65
  • perf(stylize): combine probes and precompute Bayer thresholds by @FranprzDev in #67
  • perf(render): stream chunk cache hash by @FranprzDev in #68
  • perf(morph): reuse identical hold-frame rasters by @FranprzDev in #69
  • perf(animate): fast-path transparent and opaque RGBA conversion by @FranprzDev in #71
  • perf(animate): reuse static non-glow hold frames by @FranprzDev in #72
  • fix(animate): preserve hidden RGB in transparent glow pixels by @FranprzDev in #73
  • perf(font): cache ASCII caption advances by @FranprzDev in #74
  • perf(audio): bound loudness interleave scratch memory by @FranprzDev in #75
  • perf(font): memoize current caption width by @FranprzDev in #76
  • perf(svg): escape XML in one pass by @FranprzDev in #79
  • perf(audio): eliminate per-tap decimation boundary checks by @FranprzDev in #80
  • perf(mux): avoid final MP4 copy with same-directory rename by @FranprzDev in #78
  • perf(ascii): fuse cell background and glyph blending by @FranprzDev in #81
  • perf(morph): avoid duplicate font scan per morph by @FranprzDev in #82
  • perf(audio): reduce WAV decoding peak memory by @FranprzDev in #83
  • release: 0.3.1 validated optimization batch by @FranprzDev in #84

Full Changelog: v0.3.0...v0.3.1

Reelsmith v0.3.0

Choose a tag to compare

@github-actions github-actions released this 11 Nov 01:25
87dcf10

Optional sampled instruments, offline

Reelsmith can now render music from a local SF2 SoundFont bank instead of using the same procedural synth voices for every video.

The SoundFont bank is a separate, optional download (about 148 MB for FluidR3 GM). It is not included in the release archives and Reelsmith does not download it automatically. The executables still work without it using the existing procedural, file or no-music modes.

Three sampled palettes are available:

  • acoustic: piano, nylon guitar, upright bass and brushes.
  • cinematic: strings, French horn and timpani.
  • funk: electric piano, clean guitar, electric bass and drums.

Use music.kind = "soundfont", a local soundfont path and soundfont_style = "acoustic" | "cinematic" | "funk". MCP create_project / write_brief expose the corresponding music_soundfont and music_soundfont_style fields. See the sampled-music setup.

The renderer is pure Rust, using MIT-licensed RustySynth 1.3.8. The tested bank is FluidR3 GM v3.1, distributed under MIT. Download FluidR3_GM.sf2 from that release, keep its license notice and supply its local path. Tested SF2 SHA256: 74594e8f4250680adf590507a306655a299935343583256f3b722c48a1bc1cb0. Other banks need their own license check and the required GM presets. Missing or invalid banks fail clearly rather than silently falling back to the old sound.

Brief-driven musical controls

Optional calm, uplifting and tense directions set default harmony and tempo. Explicit BPM, MIDI root and custom progression are supported with validation; a root plus explicit progression is rejected rather than silently ignored. Per-beat/end-card energy changes note density and velocity in the sampled arranger, or density/gain in the directed procedural bed. Briefs can inherit project defaults.

This is a deterministic arranger with sampled instrument palettes, not an AI music model or automatic visual/content analysis. The person or host writing the brief chooses its musical direction. No paid service or network request is needed for synthesis after the bank is available locally. Old procedural defaults, external audio files and no-music mode remain available.

Validation

  • Feature PRs #55 and #57; version PR #56. The first procedural profiles changed composition but not the sound source; #57 adds the sampled source.
  • Current-head Linux x86_64 and ARM64 CI builds and teardown skill tests passed before feature merge. Eight parser/validation library tests passed locally; source reviews found no remaining demonstrated blockers.
  • The downloaded feature CI Linux x86_64 binaries passed MCP schema, inheritance, explicit root/tempo, canonical/alias scene-energy, invalid-input brief preservation, real 6-second preview rendering and QA, cache reuse and energy-only invalidation.
  • Three integrated-engine 6-second 360p previews passed delivered-file QA: acoustic -14.03 LUFS / -1.88 dBTP; cinematic -13.96 / -3.77; funk -14.02 / -1.99. Zero detected black frames. Contact-sheet pixels were inspected.
  • Missing, empty and malformed banks, a valid bank missing required GM presets, fractional MIDI pitches and out-of-range transpositions were rejected. Bank mtime changes regenerated audio; bank content changes invalidated the full-resolution preview proof.
  • Published v0.3.0 Linux x86_64 archive downloaded and SHA256 matched GitHub asset digest (8c72bfe7b65d438ef4e2603a472473942c52977c54d15e56adaa527e50265381). Its actual executables reported 0.3.0 and passed MCP fields/inheritance, invalid-input preservation, a real 6-second sampled preview with QA, unchanged-audio reuse and energy-only regeneration. Contact-sheet pixels inspected. All four release targets built and passed MCP tool-discovery smoke checks.

Limits

The bank is user-supplied and is not embedded. SF2 reads are capped at 256 MiB, not a peak-memory guarantee or a claim of malicious-file parser hardening. Sampled renders support up to 180 seconds. The sampled bed plays across the cut with the final fade; legacy procedural drop/outro/seed variation is not implemented for this sampler. Scene energy is not a hard mute and exact beat-to-cut alignment is not promised.

Audio cache bank identity uses byte length plus mtime. Deliberately changing a bank without changing either may evade that cache; the preview proof hashes bank content. Objective QA does not prove musical taste. No speedup, HD caption readability or manual Windows/macOS/ARM runtime validation is claimed. The Linux test host emits a nonfatal weak GLIBC_2.39 warning; passing these checks is not a general compatibility guarantee.

Changes: #55 · #57 · #56

Reelsmith v0.2.3

Choose a tag to compare

@github-actions github-actions released this 10 Nov 13:26
3a902f7

Render-failure safety patch

  • Reject an empty music.progression when music is procedural, before audio generation. Previously this hand-edited configuration could panic and leave the MCP session's job stuck as running, blocking later renders.
  • Record a generic failed-job outcome if the pipeline unwinds with a panic, instead of leaving the job slot busy indefinitely.

Includes v0.2.2's brief-preservation fix and missing-input typo hints. No performance gain is claimed; the audio-overlap experiment remains outside the release.

Validation and limits

The exact empty-progression failure was reproduced in the published v0.2.2 binary. After the input-validation fix, the invalid request fails cleanly and a following valid request in the same MCP session completes a fresh 360p render with QA passing. The defensive catch_unwind branch was reviewed in source, not tested by injecting a panic. Abort/OOM/stack-overflow failures are not caught, poisoned-lock recovery is not promised, and a panic can leave partial cache files. Generic error output does not forward panic payloads.

Four platform archives are built and MCP-smoke-checked by CI. The downloaded Linux x86_64 archive matched its published SHA256 and reported version 0.2.3 with 14 MCP tools. The empty-progression request failed cleanly, then the SAME server completed a fresh uncached 360p render (1.3-second output, -13.95 LUFS, -8.96 dBTP, zero detected black frames). Actual sampled contact-sheet pixels were inspected; captions were disabled, with no HD or overlay-readability claim. This host printed a non-fatal weak GLIBC_2.39 warning; checks still completed, not a general Linux compatibility guarantee. Windows, macOS and Linux ARM64 are not claimed as manually runtime-tested.

Reelsmith v0.2.2

Choose a tag to compare

@github-actions github-actions released this 10 Nov 12:52
f31dd9c

Brief safety and missing-input hints

  • A rejected write_brief request no longer overwrites the previous working brief.toml. The new brief is validated in a separate file before replacement.
  • Missing clip and motion-asset names now include nearby existing-name suggestions, reducing the need for another folder-listing call after a typo.
  • Suggestions exclude extension-case combinations that would leave the input unresolved on case-sensitive filesystems. This is conservative on case-insensitive filesystems, where some usable hints may be omitted.

Validation and limits

The brief-preservation fix was checked through real MCP calls: a negative-duration request leaves the old brief unchanged; valid updates, missing-input reports and concurrent successful writes still work. A fresh 360p procedural smoke render passed duration, dimensions, loudness and black-frame QA, and its sampled contact sheet was inspected.

Concurrent writes remain last-successful-writer-wins. Replacing a symlink destination replaces the link itself rather than writing through it. Abrupt process termination may leave a temporary file. No new performance gain is claimed; the audio-overlap experiment is not included.

The release workflow builds four platform archives and smoke-checks the MCP surface. The downloaded Linux x86_64 archive matched its published SHA256 and passed the 0.2.2 / 14-tool MCP smoke, rejected-edit SHA256 preservation, typo-hint checks, and a fresh uncached 360p render (1.3 seconds, -13.95 LUFS, -8.96 dBTP, no detected black frames). Sampled contact-sheet pixels were inspected. On the older local Linux runtime it printed a non-fatal weak GLIBC_2.39 version warning; these checks still completed, but this is not a general Linux compatibility guarantee. Windows, macOS and Linux ARM64 are not claimed as manually runtime-tested.

Known issue found after publication

A hand-edited config with procedural music and an empty music.progression = [] can panic during audio generation and leave that MCP session's render job stuck as running. Avoid empty procedural progressions; if already stuck, restart the MCP server process. The empty-progression trigger is fixed in v0.2.3 (PR #53), verified with the published Linux binary in the same-server invalid-then-valid flow. Upgrade to v0.2.3 for this fix. This issue predates the brief-preservation change.

Reelsmith v0.2.1

Choose a tag to compare

@github-actions github-actions released this 08 Nov 16:37
6ac8220

Patch release: fixes the case that made draw_diagram overlays unreadable inside short promo beats.

What changed

  • #46 - draw_diagram entrance timing. duration_s was a pure entrance: an 8 s diagram stayed invisible for its first ~4 s and fully drawn only at ~7 s, so inside a typical 2-4 s beat it never got past thin half-drawn strokes. Now duration_s is the total overlay length: the entrance draws in the first entrance_s seconds (new arg, default min(duration_s, 2.0)) and the finished diagram holds for the rest. The result gains fully_drawn_s - the minimum time a beat should keep the overlay on screen.

Behavior change, with opt-out: duration_s no longer means entrance-only. Pass entrance_s = duration_s for the old all-entrance behavior. hold_s / exit_s remain configurable; when an exit is set, the hold shortens so the total stays duration_s.

Validated end-to-end on the originally reported case (TD flowchart, 3 nodes): same 4 s beat at 360p, before = outlines only, after = fully drawn and legible mid-beat. CI green on all targets; both review passes posted on the PR.

Notes

  • macOS builds run on macos-15 (the macos-14 arm64 pool was retired by GitHub).
  • The darwin/windows binaries are verified by CI's smoke check only; the linux x86_64 binary was downloaded from this release and smoke-tested (serverInfo 0.2.1, 14 tools).

Reelsmith v0.2.0

Choose a tag to compare

@github-actions github-actions released this 07 Nov 21:41
bd440c7

Highlights

  • draw_diagram legibility (#42): the tool now reports the smallest text in the rendered .mov and the overlay width needed for 24-px text in a 1080-wide frame, with a warning when the layout cannot stay readable (it suggests a taller/narrower layout, e.g. direction TB, or splitting the diagram). Diagrams default to a tighter 4% canvas margin (margin_frac configurable; animate_svg keeps 12%). Verified legible in real composites at 360p and 1080p.
  • Stale-cache fix (#38): replacing a clip or motion overlay with a same-name file now re-cuts its plates and re-measures its crop, keyed on a size + modification-time fingerprint. Known limit: an edit that preserves both size and mtime (e.g. restored with touch -r) is not detected; normal saves are.
  • Faster QA (#39, #41): black-frame detection and the contact sheet now share one video decode (QA 2.10s -> 1.82s on the 292-frame 360p sample, byte-identical output), and per-shot motion medians are cached across QA passes (warm QA rerun 1.81s -> 0.44s).
  • No-op builds skip mux and QA (#43): when the chunks and the mastered mix are unchanged, the build keeps the existing MP4 and QA verdict instead of re-muxing and re-decoding. Measured on the 360p sample: no-op build 1.03s -> 0.10s (this is the no-op path only - not a general render speedup; at 1080p it additionally avoids two full-video decodes). An externally edited or replaced output file is always re-muxed.
  • morph_svg (#37): shape-morphing SVG overlays (flubber) with motion-stack mapping.

Upgrade note

Cache keys changed in this release: the first build after upgrading re-cuts plates and re-renders chunks once. Later builds hit the caches as before.

Validation

Every change merged with green CI (Linux x86_64 + aarch64) and measured before/after numbers in its PR. Release binaries are smoke-checked (MCP tools/list) on all four targets before publishing.

Reelsmith v0.1.0

Choose a tag to compare

@github-actions github-actions released this 04 Nov 22:33
ca88ba9

What's Changed

  • chore: vendor the datavid and promo crates from the harness by @FranprzDev in #1
  • refactor: move the render and build pipeline into the promo library by @FranprzDev in #2
  • feat: render lossless chunks and encode the delivery MP4 with an auto-picked encoder by @FranprzDev in #3
  • feat: add the reelsmith MCP server over stdio by @FranprzDev in #4
  • feat: add a procedural sample library and an end-to-end example by @FranprzDev in #5
  • docs: add the MCP install guide, host configs and a 3-minute demo script by @FranprzDev in #7
  • chore: add a release workflow for Windows, macOS and Linux binaries by @FranprzDev in #6
  • chore: move GitHub Actions to Node 24 releases by @FranprzDev in #8
  • perf: cut plates in parallel with a bounded worker pool by @FranprzDev in #9
  • perf: render chunks in parallel on the worker pool by @FranprzDev in #11
  • perf: render chunks as lossless FFVHuff instead of FFV1 by @FranprzDev in #14
  • feat: detect the GPU backend and tune presets per quality tier by @FranprzDev in #13
  • docs: add PERFORMANCE.md with measured gains and RTX 4060 settings by @FranprzDev in #15
  • feat: add animate_svg tool for alpha motion graphics from SVG by @FranprzDev in #16
  • feat: add draw_diagram tool for self-drawing Mermaid motion graphics by @FranprzDev in #17
  • feat: add stylize_clip tool for ASCII and dither clips by @FranprzDev in #18
  • docs: promo copy and design guidance (from Elaya's MIT skill) by @FranprzDev in #19
  • Require a completed 360p preview before draft/final renders by @FranprzDev in #20
  • Append a local JSONL history of completed renders by @FranprzDev in #21
  • Optional per-install render telemetry to your own API by @FranprzDev in #22
  • Telemetry API: Cloudflare Worker (Rust) + D1 by @FranprzDev in #23
  • feat: add teardown skill for technical video assets by @FranprzDev in #24
  • docs: optional simready skill for 3D asset video sources by @FranprzDev in #25
  • feat: add HyperFrames as an optional render engine alongside fframes by @FranprzDev in #26
  • fix: encode chunks once and stream-copy the final video by @FranprzDev in #27
  • docs: add motion direction guide by @FranprzDev in #28
  • qa: fail the build when a beat's source is a still photo by @FranprzDev in #29
  • docs: reproducible reference renders under evaluations/ by @FranprzDev in #30
  • feat: add optional Tesseract asset preview bridge by @FranprzDev in #31
  • feat: add MCP stdio client and render comparison scripts by @FranprzDev in #32
  • docs: add video lessons and a from-scratch agent guide by @FranprzDev in #33
  • fix: build promo on Windows (copy HyperFrames assets instead of symlink) by @FranprzDev in #35
  • fix: upload only release archives, not the staging dir by @FranprzDev in #36

New Contributors

Full Changelog: https://github.com/FranprzDev/reelsmith/commits/v0.1.0