FilmCraft changelog

FilmCraft changelog

Back to FilmCraft

14 releases since October 2026 · GitHub releases, checked Oct 26, 2026

  1. 0.13.0LatestBig update

    • i18n test: leave installed right-to-left faces out of the Japanese check
    • CI: run cargo xtask ci on pull requests and pushes to main
    • M8: Fujifilm F-Log, F-Log2 and F-Log2 C colour spaces (F-Gamut / F-Gamut C)
    • Require session-token authentication for desktop control requests by @coderabbitai[bot] in
    • Reject signed fields inside multi-field timecodes
    • Keep WebVTT cues whose identifier starts with NOTE
    • Escape tab/newline/CR in XML attribute values
    • Fix false overlaps for empty time ranges
    • Reject signed fields in SCC timecode parser
    • #2679: effects.setParam refuses values outside the parameter's range
    • Reject non-hex characters in colour hex parsing
    • fix: harden saves, CLI file I/O and AV1 tooling (SonarCloud security/reliability)
    • Regression tests for #130, #703, #1084 and #1309
    • Scroll the timeline clip menu when it is taller than the screen
    • security(interchange): bound imported track indices
    • security(text): bound text and phonemizer work
    • Raise a loaded project's next_id past the ids already in it
    • security(proxies): reserve outputs atomically
    • security(hevc): validate slice payload before allocation
    • security(codecs): avoid quadratic MPEG timestamp lookup
    • security(platform): bound hybrid replay output
    • security(isobmff): bound metadata expansion
    • security(matroska): compose stripped private data once
    • security(h264enc): cache second-pass plan sums
    • security(bench): isolate temporary export outputs
    • security(engine): bound graphic template thumbnails
    • fix(control): bound synthetic pointer events
    • security(tts): make malformed-token scanning linear
    • security(ui): bound export folder elision work
    • security(text): keep font scans within configured folders
    • codecs: walk open-GOP leading pictures back in a loop, not by recursion
    • security(opus): validate direct multistream headers
    • security(text): bound transformed glyph masks
    • security(avi): bound OpenDML index work
    • Project panel: a clip dropped on New Item makes a sequence from it
    • security(mxf): share resolved descriptor metadata
    • security(render): bound expanded frame plans
    • security(engine): confine stored media filesystem access
    • ci(deps): bump Swatinem/rust-cache from 2.9.2 to 2.9.3 in the actions group by @dependabot[bot] in
    • security(dnx): validate fields before frame allocation
    • security(mpeg2v): index picture extensions linearly
    • security(apv): validate tile payload before allocation
    • security(project): validate graphic templates in linear time
    • security(videotoolbox): bound reorder buffering
    • fix(interchange): sanitize embedded-audio output folder names
    • security(codecs): deduplicate hardware parameter-set checks
    • security(av1): require unique complete tile coverage
    • security(automation): isolate bridge screenshots
    • security(export): confine metadata-derived names
    • security(bitstream): cache RBSP stop-bit lookup
    • fix(bitstream): reject invalid length-prefixed NAL widths
    • security(vp8): bound frame allocation
    • security(vp9): bound frame allocation
    • security(prores): bound decoded plane storage
    • security(exr): validate chunks before frame allocation
    • Use chrono instead of hand-rolled UTC conversion
    • packaging: use [[ for bash conditional tests (SonarCloud S7688)
    • tools: quit the super-linear regex scans in the spec table extractors (SonarCloud S8786)
    • CI: xtask ci in the dev profile, one test binary per crate, nextest
    • fix(engine): resolve stored media paths with craft-docpath's resolve_absolute
    • Fonts: pin craft-fonts bfcbf71; CRAFT_FONTS_REQUIRED fails without CRAFT_FONTS_DIR
    • Packaging: pin the signing client and appimagetool, and check their hashes
    • CI: shared gate workflow; FreeBSD nightly and on release
    • release: the git-sources gate moves into craft-common-actions (storytold/craft-common-actions#78)
    • i18n: missing translations never fail; xtask ci prints the missing list
    • ci(sonar): stop cancelling main-branch runs so coverage is published
    • Build: use craft-media for bitstream, isobmff and matroska
    • fix(media): validate Radiance HDR data before frame allocation
    • fix(captions): reject deeply nested TTML before parsing
    • security(dng): bound tile decoding and IFD traversal
    • security(ogg): bound recovery scanning
    • security(mxf): bound recovery and PCM edit units
    • security(omf): bound metadata expansion and traversal
    • security(export): bound image overlay decoding
    • security(render): bound burn-in text rasters
    • security(captions): bound burn-in overlays
    • security(mpeg2v): bound access-unit output
    • security(aaf): bound materialized streams
    • security(avi): bound framed audio scans
    • security(remix): bound analysis resources
    • security(tts): verify Kokoro checkpoint before parsing
    • security(h264): bound hostile picture allocation
    • security(render): bound embedded LUT resolution
    • security(codecs): cap GOP cache frame retention
    • security(mpegts): avoid repeated audio buffer drains
    • security(captions): bound TTML speaker labels
    • security(captions): bound TTML inline span output
    • security(h264): enforce long-term DPB limits
    • security(engine): validate imported sequence settings
    • security(speech): bound diarization clustering work
    • security(project): scan malformed caption markup once
    • security(hevc): bound specification equation parsing
    • security(format): preserve permissions on atomic replacement
    • security(captions): bound malformed text processing
    • security(frame): bound decimation sampling work
    • fix(speech): contain and verify downloaded model artifacts
    • fix(speech): bound Whisper model metadata allocations
    • security(interchange): harden FCPXML cycle detection, XML DTD entities, and imported formats
    • security: harden developer tools, scripts, and testkit against hostile input
    • security(codecs): validate VP9 empty tiles and AV1 film grain scaling points
    • security(engine): require local trust for ingest destinations
    • security(audio): bound sequence sample rates and AAF/OMF export channel buffers
    • Import: numbered embedded-audio names keep the path's separators on Windows
    • Don't treat pieces with different settings as through edits
    • Keep WebVTT cues whose identifier is STYLE or REGION
    • Export: say why H.265 and AV1 are unavailable without a hardware encoder
    • Only materialise kept frames when filling an H.264 frame_num gap
    • fix(control): release idle connection slots after socket timeouts
    • HEVC: share gray picture backing across unavailable references
    • Recovery: retain candidates after a failed discard
    • ProRes: write final alpha singleton run codes
    • control: preserve MCP pointer input defaults
    • Audio meters drop to silence right after Stop
    • Timeline: the Razor tool cuts captions
    • Timeline: Option-drag duplicates captions
    • Edit: Copy, Cut and Paste work on captions selected in the Timeline
    • Text panel: the Captions list follows the playhead
    • History: the panel menu deletes redoable actions and clears the history
    • media: import animated WebP as a clip
    • Timeline: the work area bar, with Set Work Area Bar In and Out Point
    • relink tests: no unused index_folder import on Windows
    • Merge 6 open PRs (tested batch)
    • effect controls: drag a transition's cut to move it with the transition
    • Timeline: a Rolling Edit drag stops at the roll's limits
    • Timeline: Show Duplicate Frame Markers marks media frames used more than once
    • Audio Track Mixer: Show/Hide Tracks and Meter Input(s) Only are commands with Premiere's keys
    • Monitors: Transparency Grid shows the picture's transparent areas
    • Timeline: a transition stays within its clips after a regular trim
    • Follow-ups to #3240: alpha upload table, duplicate markers off the UI thread, cut drag over the clips
    • @melchiaaronzedek made their first contribution in
    • @coderabbitai[bot] made their first contribution in
    • @Lucenx9 made their first contribution in
    • @mercuryVM made their first contribution in
    • @dependabot[bot] made their first contribution in
    • @aiongg made their first contribution in
    • @admbe made their first contribution in
    • @texjer made their first contribution in
    • @thiscallnet made their first contribution in
  2. 0.12.0Big update

    > [!NOTE] > FreeBSD aarch64 is dropped from this release. We had to cut releases, and we cannot build this target within the 5-hour CI limit for any of the Craft apps, so we are dropping it for now. This is a known blocker, flagged for a future fix in storytold/craft-common-actions#39. FreeBSD x86_64 and every other platform are included.

    • Reject TTML offset times that have no integer digits
    • Speak the minus sign of negative currency amounts in TTS normalizer
    • Keep file URL hosts that only start with "localhost"
    • Read the a of a.m. and attached am as the letter name A
    • dev_icon: write the MimeType line the packaged .desktop file has
  3. 0.11.0Big update

    > [!NOTE] > FreeBSD aarch64 is dropped from this release. We had to cut releases, and we cannot build this target within the 5-hour CI limit for any of the Craft apps, so we are dropping it for now. This is a known blocker, flagged for a future fix in storytold/craft-common-actions#39. FreeBSD x86_64 and every other platform are included.

    • docs: add SonarCloud and CodeRabbit badges to README
    • Skip CodeRabbit reviews on Dependabot PRs
    • ci: switch to shared nix workflow from craft-common-actions
    • fix(macos): ask to save on Cmd-Q instead of quitting outright
    • Order auto-saves by real time so rotation keeps the newest
    • #2342: CLI file.exportMedia waits for the export before the process exits
    • engine: preserve existing files when AAF/OMF imports embedded audio
    • codecs: avoid duration-sized silence allocation for damaged MP4 audio
    • Re-open a failed audio output while playing instead of going silent for good
    • Hostile-input hardening for video decoders (AV1 panic + oversize allocation, MPEG-2 allocation) and fuzz tests
    • fix: use async file I/O in async MCP handler (SonarCloud rust:S7493)
    • security: validate CLI paths/args in dev tools (SonarCloud S2083/S8707/S8705)
    • security: enforce HTTPS on curl downloads (SonarCloud S6506)
    • README: the app icon above the title
    • @justacalico made their first contribution in
    • @g1obalworlds made their first contribution in
    • @bflatastic made their first contribution in
  4. 0.10.0Big update

    > [!NOTE] > FreeBSD aarch64 is dropped from this release. We had to cut releases, and we cannot build this target within the 5-hour CI limit for any of the Craft apps, so we are dropping it for now. This is a known blocker, flagged for a future fix in storytold/craft-common-actions#39. FreeBSD x86_64 and every other platform are included.

    • Skip GPU goldens when Rgba32Float is not renderable
    • [agent] Dialog buttons show the pointing hand on hover
    • Graphics: an outer stroke with Fill off draws only the ring outside the edge
    • cli: reject deeply nested dotted parameters before parsing
    • Reject .3dl LUTs whose input mesh is larger than 256 entries
    • fix(export): tag SDR exports with a colr box
    • Captions: default TTML tick rate follows the frame rate multiplier
    • matroska: bound recursive chapter and tag parsing
    • fix(effect-controls): a dropped graph keyframe stays where it was dropped
    • Reject non-numeric --seconds and --scale in CLI render
    • Refuse numbers separated by spaces or a unit in number fields
    • monitor: the Source waveform follows the time ruler's zoom
    • #1871: Lens Blur works out its disc offsets once per frame, not per pixel
    • Saturate crop and field-height math on hostile Matroska/MXF/AAF headers
    • fix(engine): enable Multi-Camera Enable/Flatten only for clips they work on
    • fix(cfb): adding a child is O(1), not a scan of every sibling (AAF export of 20 000 markers took a minute)
    • Fonts: faces with no outline tables are no longer listed
    • Basic 3D: Distance to Image keeps its perspective at every render scale
    • Fix TTS reading of prices with more than two decimal digits
    • Fix resize cursor directions for graphics handles
    • Properties panel edits the selected caption's text and in/out times
    • codecs: the pixel-format label comes from the SPS before the avcC/hvcC fields
    • #1544: an export started without wait says where to follow it (jobs.list, jobs.cancel)
    • captions: pin the setStyle margin contract with a regression test; clearer track error
    • #1922: Audio Clip Mixer strips narrow to fit the panel, and scroll when they cannot
    • ci: configure Dependabot for Cargo and GitHub Actions
    • Fix "-0.000" in Seconds time display for tiny negative times
    • Preserve per-channel shaper domain in .cube round trip
    • #2328: Effect Controls draws a line between the fixed and the added effects
    • #2430: a click in the text being edited on the monitor moves the caret
    • #2185: preview files are read in place, not loaded whole
    • Properties: selected-character drags undo as one gesture
    • #2253: Ctrl+Plus no longer scales the interface one way only; View > Reset Interface Zoom
    • fix(mcp): pin doc_inspect's sequence to the reported active id
    • #1362: Create Multi-Camera Source Sequence and Merge Clips work on Timeline selections
    • #2325: Settings > Appearance can turn the interface animations off
    • #2329: the Effects panel indents what a folder holds under it
    • #1682: thumbnail textures are capped, least recently used freed first
    • i18n: German (de) covers the whole interface
    • #1985: a panel closed while floating opens again floating where it was
    • Fix AudioSamples time display for negative times
    • #2358: stopwatches in the Essential Graphics panel animate layer properties
    • Timeline: colour labels for tracks
    • #1487: the Text panel's Graphics tab lists and edits the sequence's graphic text
    • docs: drop references to competing commercial software
    • @alexng353 made their first contribution in
    • @ssandweiss made their first contribution in
    • @Wbunker made their first contribution in
    • @dotCooCoo made their first contribution in
    • @TheGalitube made their first contribution in
    • @00xJS made their first contribution in
    • @notdezzi made their first contribution in
    • @Felix-Helleckes made their first contribution in
    • @jackcanon made their first contribution in
    • @MichaelMuClaude made their first contribution in
  5. 0.9.0Big update

    • fix: preserve individual linked-clip selections through deletion
    • fix(interchange): avoid UTF-8 slice panics in file URLs
    • fix(media): preserve Unicode prefixes in image-sequence filenames
    • fix(export): prevent nested renderer-pool deadlocks
    • ci: delegate FreeBSD workflow to craft-common-actions and add nix check
    • ci: standardize FreeBSD workflow on shared FreeBSD 15.1 action
    • Follow stored media paths only on this computer or the project's share
    • @nuclearspike made their first contribution in
  6. 0.8.0Big update

    • Captions: preserve fractional TTML tick offsets
    • Export: 32-bit integer and 32-bit float audio
    • fix(apv): skip oracle tests when ffmpeg predates APV support
    • test(i18n): skip the Japanese language step when no Japanese font is available
    • fix(ui): open the context menu on macOS Ctrl+Click
    • codecs: import raw ADTS .aac files
    • Adjustment layers: a transition fades their effects in and out instead of cutting them in after it
    • codecs: MP4 frames stamped just after the frame grid show on their own frame
    • fix(masks): hide the mask handles while the clip is not selected
    • render: Sharpen stays visible at reduced playback resolution
    • WIN-03: Make AVI oracle file reads portable
    • #1368: nudge clip selection up/down works for linked video+audio
    • #1371: export preset query also matches the format id
    • fix(previews): a nest's audio preview follows the sound of its sequence
    • Captions: preserve tab-separated WebVTT voices
    • #1408: Shift constrains mask vertex and whole-mask drags to 45°
    • #1407: import Radiance HDR stills and image sequences
    • #1322: the Properties panel scrolls
    • #1430: mpegts: resync inside the loaded block, bad adaptation field is not lost sync
    • fix(media-browser): drag every selected file to the Timeline, not just one
    • fix(bitstream): map se(v) through the 64-bit codeNum so i32::MIN round-trips
    • mpegts: simplify and avoid redundant work
    • fix(dock): dock a panel along the edge of the whole workspace
    • fix(home): list recent projects on Home and in File ▸ Open Recent
    • #262: Linux file dialogs shown off the UI thread keep case-insensitive filters
    • ui: keep Metadata and Info on the selected source item
    • Keep transform handles in reach when the picture is past the monitor edge
    • fix(audio): crossfade audio transitions through the clip handles
    • ingest: preserve same-named camera takes during ingest
    • fix(ui): Space and other shortcuts keep working after dragging a pane divider
    • fix(codecs): in-band parameter sets compare without trailing zero bytes
    • macOS: open the window on Intel Metal by skipping indirect-call validation
    • timeline: a middle-button drag pans, whatever the tool
    • fix(menus): hovering another title switches the open menu
    • fix(timeline): stop Ruler timestamps disappearing while zooming
    • Effects panel: keep the whole name of a folder that contains a slash
    • fix(engine): preserve offline sources referenced through subclips
    • captions: preserve speaker names in TTML metadata
    • graphics: draw with the newer driver when Windows lists one GPU through two versions of it (#609 on the #827 start-up)
    • fix(settings): keep long translations on the Preferences pages
    • fix(mcp): a slow bridge command no longer blocks every later call
    • fix(timeline): クリップの右クリックにマーカー追加を用意する
    • Help menu: say where each item goes; keep the address when no browser opens
    • fix: 新規トラック移動のリンクと編集履歴を保持
    • #1023: the eyedropper picks from the Program monitor again
    • #1081: Align to Video Frame works on selected video and image clips
    • Pad sorted project-panel column headers
    • Let Finder open .fcproj files
    • fix(shortcuts): Clear and reassign also drop a command's panel copy of its key (part of #1333)
    • fix(masks): Delete / Backspace and Cmd+Z take back the last pen point while drawing
    • #1402: import MP1 (A_MPEG/L1) audio from Matroska
    • #1429: MPEG-1 program stream cut inside a pack header no longer panics
    • Timeline: scrolling the video tracks up leaves room to drop a new track
    • export: clip caption sidecars to the exported range
    • Transform shutter: use the sequence frame rate on adjustment layers
    • Adjustment layers: a Transform replaces the picture below instead of drawing over it
    • media: decode uncompressed and PackBits YCbCr TIFF stills
    • #1241: Select All in Effect Controls selects its keyframes
    • fix: トラックロックの斜線表示とドラッグ保護を修正
    • timeline: Alt marquee selects clips without linked partners
    • Fix clip drags leaving transitions behind
    • packaging: Linux file managers offer FilmCraft for .fcproj projects and video files
    • Import YUV4MPEG2 (.y4m) video; stop offering .ale for import
    • #828: import PXR24-compressed OpenEXR
    • Add edit.rippleDeleteHead (Ripple Delete Head Frame)
    • h264: validate malformed PPS fields instead of panicking
    • i18n: Korean (ko) interface catalog
    • i18n(es): fix mistranslations and terms, add 4 missing rows
    • Ita Tranlsate
    • #1432: mpegts: bounds-check frame_info, cap chunks, units and allocations, drop non-PES data
    • @webdevtodayjason made their first contribution in
    • @AkashBhat14 made their first contribution in
    • @slimwerken made their first contribution in
    • @marcoarnulfo made their first contribution in
    • @fabian-co made their first contribution in
    • @Narmjep made their first contribution in
    • @CokeRoach made their first contribution in
    • @JeremyYao made their first contribution in
    • @Silvertree2010 made their first contribution in
    • @bfenty made their first contribution in
    • @diegozpy made their first contribution in
    • @Nai-ITA made their first contribution in
  7. 0.7.2Big update

    • Share docking transactions and preserve FilmCraft panel behavior
    • ci: refactor workflows to use storytold/craft-common-actions
    • #853: Shift constrains pen mask segments to 45° steps
    • Reveal in Finder for Project clips with a local path
    • fix(media): RF64 trailing metadata stays outside audio duration
    • Keep nested sequence markers in OTIO export
    • Export: correct loudness lost to peak limiting
    • Keep New Sequence open when frame size is rejected
    • #980: VP9 decode loop-filters a frame as a superblock-row wavefront
    • #790: Matroska AAC / MP3 / AC-3 trims the exact CodecDelay
    • #923: reordered Matroska video without DefaultDuration keeps its frame rate
    • timeline: box selection updates live while dragging
    • Engine: list edge, params and reverse in the sequence.applyAudioTransition schema
    • Timeline: keep continuous thumbnails fixed while the view zooms
    • fix(effects): keep a setParam keyframe outside the clip at its time
    • dock: the mouse wheel over a tab strip switches tabs
    • Roll linked audio with the picture cut
    • #243: text fields keep unmodified keys so IMEs can compose
    • One undo for a Scale (and similar) mouse drag
    • Essential Graphics: an Install refused shows why on the status bar
    • fix(render): update Noise grain on every frame using exact timestamps
    • Timeline: a drag with Track Select Forward/Backward moves what it selects
    • fix: 値グラフからキーフレームの補間を選択 #962
    • tools: press and drag a grouped tool to open its flyout
    • meters: adapt to the panel's size; react while scrubbing
    • fix(render): 5.1 sources on a stereo track fold down instead of losing C and surrounds
    • Timeline: a press on the ruler moves the playhead at once
    • fix(cli): fail export/render that drew offline media unless --allow-offline
    • fix: パネルのフォーカス枠の欠けを修正 #1075
    • macOS: app menu follows the interface language
    • Keep recovery snapshots when session metadata is unreadable
    • monitors: about 10% of zoom per wheel notch, exactly reversible
    • Underline vertical graphic text
    • Underline follows baseline shift on whole-style text
    • Fix #1072: Text panel 'Import captions file…' button label invisible in light mode
    • #1091: Home / End and other jumps scroll the Timeline to the playhead
    • fix: 再生停止後も音量メーターを更新 #1062
    • Hot-text number fields select the whole value when clicked
    • #867: Indonesian (id) interface translation
    • #847: AV1 decode runs deblocking, CDEF and loop restoration in parallel row bands
    • Refuse trim and timing edits on a locked track
    • Match Frame on a reversed clip uses moving source time
    • Fix Extract hard cutoffs and clipped caption font targets
    • Clear used media as offline instead of stripping the timeline
    • #820: fall back to DX12, then a software adapter, when the graphics start fails
    • #844: on-monitor corner-roundness handle for masks
    • #965: HDR and wide-gamut media play on the GPU path
    • OS drops on an empty Timeline create a sequence
    • #841: import packed 10/12-bit and Y'CbCr DPX stills
    • #840: restart an audio stream the device drops instead of playing silent
    • Reject negative times on timeline.place and markers.add
    • LongGOP seek / time-to-first-frame, not the H.264 throughput gap
    • Import every MPEG audio stream, not only the first PID
    • MCP invalid --bridge exits 2 like other usage errors
    • #924: decoded H.264 / HEVC frames keep the signalled colour primaries
    • WIN: stabilize Windows verification prerequisites
    • Reject non-finite numbers and empty LUT input ranges in .cube import
    • #1018: Scene Edit Detection in the timeline clip's right-click menu
    • fix: サブクリップ配置で親の音声を保持 #913
    • Escape cancels a drag in progress: drag-and-drop, value drags, color pickers and dialogs
    • Export FCP7 XML markers on source media
    • #395: Arabic and Hebrew in the interface: fallback fonts, captions in reading order
    • Timeline: dragging a clip above the top track or below the last one adds a new track
    • fix(tts-text): preserve magnitude, fractions and leading zeros in narration
    • Move fade-out with a non-ripple Speed/Duration change
    • Refuse timeline.move when the source track is locked
    • Clamp Automate Cross Dissolve to the placed overlap
    • #922: eight-channel AAC reports and returns eight channels
    • Lumetri panel: truncate a long clip name in the header so the control rows stay in view
    • settings: label colour presets (built-ins, import, export, delete)
    • fix(audio): シャトル再生で音程維持設定を反映
    • #831: cargo xtask parity measures effects and transitions (--area)
    • #480: exports no longer stop for good when a clip's decoding uses rayon (rotated iPhone HEVC clips)
    • Opening Demo Project does not keep the previous save path
    • Import FCPXML one-frame markers as points
    • One undo for a multi-point Trim by Frames
    • Add OmaStore manifest
    • Paste cut clips even when old OS clipboard files linger
    • #835: workflow acceptance tests through the MCP server, checked by ffprobe
    • #854: GIF frame delays add up to the sequence duration
    • monitors: show the unreadable slate for persistently failing (damaged) media
    • Clear Close Sequence also clears File Close (Cmd+W)
    • fix(export): estimate TIFF sequence size using the actual channel count
    • #928: the schema reports Restore open sequences as wired
    • Count VideoToolbox sessions, frames and declined requests in perf.stats
    • Keep the voice-over start point when recording past the end of the timeline
    • timeline: drag the outer track edges to resize
    • docs: German in the localization parity table (follow-up to #630)
    • #371: split stereo halves from FCP7 XML play on their own side
    • fix: ハイフン区切り数字の先頭ゼロを保持 #910
    • Text editing on the Program monitor: double-click and Ctrl/Cmd+A select all the text
    • Export: unknown keys in settings are an error, not ignored
    • fix(captions): apply body and div timing to TTML paragraphs
    • fix(playback): rest Program marked playback on the Out frame
    • Export: FLAC (clean-room encoder; .flac files and FLAC audio in MP4/MOV)
    • #598: import AVI files (clean-room AVI / OpenDML demuxer)
    • program monitor, effect controls: on-screen transform handles for Motion and Transform
    • #809: own MPEG audio Layer I / II decoder plays MP2 at ffmpeg's default bit rates
    • #1039: faster HEVC motion compensation and deblocking, bit-exact (−10…28% cycles per frame)
    • #432: VP8 video decodes (clean-room pure-Rust VP8 decoder), so VP8 WebM no longer shows black
    • Type text committed by an input method into text layers on the monitor
    • monitors: a zoom bar for the time ruler, larger transport buttons
    • #859: complete the Brazilian Portuguese (pt-br) interface translation
    • Project panel: dragging one of several selected items places them all, back to back, in one undo step
    • number fields: type a calculation and get its result
    • i18n: complete and polish the Japanese catalog
    • fix: マーカーの色変更と範囲帯の右クリックを修正
    • #786: right-click Label menus show the label colours
    • #1092: Project panel Shift-click selects the range from the anchor
    • Show audio effects in Effect Controls on linked A/V clips
    • #857: reject unknown marker colour names instead of storing Green
    • Linked Rate Stretch keeps one speed when a neighbour limits a partner
    • Source marks honour frame, seconds and timecode
    • #850: launch files open whatever the extension's case, with absolute paths
    • #260: file dialogs on Linux no longer stop the app (GNOME "not responding")
    • export: type the file name and pick the location in Quick Export
    • fix(menus): native menu follows command enablement
    • #402: animated GIF and APNG import as clips, with transparency
    • #1065: CinemaDNG / DNG import with a clean-room decoder
    • #874: compressed (RLE / ZIPS / ZIP) OpenEXR export
    • fix(timeline): snap sub-frame timeline.place to the frame grid; inspect counts export's frames
    • fix: エフェクトコントロールの矩形選択とShiftスナップを修正
    • #828: import OpenEXR stills and image sequences
    • Median Radius is not capped at four working pixels
    • M7: optimize audio DSP and isolate the unchanged mixer throughput gate
    • Trim MP3 encoder delay when decoding audio files
    • fix(ui): add Korean font fallback for UI text
    • UI: favorite themes and appearance shortcuts
    • #1039: 8-bit HEVC pictures as u8, in-place motion compensation (−14…23 % per frame), big-picture analysis
    • Linux: VA-API EncSlice probe and bounded export GPU wait
    • timeline: cancel drag and restore playhead on Escape
    • dialogs: drag them by the title bar (open centred, no longer anchored)
    • fix: Close Gapをショートカットに割り当てられるようにする
    • ui: reduce sequence copying and cache transcript redraw data
    • #1124: ⌘D / ⇧⌘D apply transitions to the selected clips or edit points
    • Release workflow: pass the Azure signing secrets
    • @skylartaylor made their first contribution in
    • @earlvanze made their first contribution in
    • @itrycodinganditsbad made their first contribution in
    • @opentechnepal made their first contribution in
    • @mktk1117 made their first contribution in
    • @whatever-industries made their first contribution in
    • @jahvari made their first contribution in
    • @seif9116 made their first contribution in
    • @KitsuneSemCalda made their first contribution in
    • @FredApps made their first contribution in
    • @japbcoelho made their first contribution in
    • @aw4e made their first contribution in
    • @FacedFour1207 made their first contribution in
    • @Auipp made their first contribution in
    • @OorjitSethi made their first contribution in
    • @n-delic made their first contribution in
  8. 0.6.0Big update

    • CLI: a closed stderr no longer panics with exit 101
    • CLI export: forward a lone --start or --end so the engine reports the missing bound
    • Roll: reversed clips take the cut from the opposite source end
    • fix(edit): reversed trims use the media handle their playback direction consumes
    • Trim: extend each selected edit point to the playhead by its own distance
    • Linked slip: clamp to one shared delta so picture and sound stay aligned
    • Frame-held Regular In trim stops at the previous clip instead of overlapping it
    • Export settings: accept camelCase for nested snake_case fields
    • Queue move: saturate a huge relative offset instead of overflowing
    • Forced relink and Replace Footage keep the new file's properties
    • Project Manager: keep every parent of a nested subclip when collecting
    • Parametric Equalizer: use the full EQ so master gain, bands 1/2/4/5 and pass filters reach the audio
    • Audio Gain: measure the peak of the audio stream each clip plays
    • masks.addVertex: clamp oversized index on animated paths, reject empty paths instead of panicking
    • MCC export: end each ancillary packet with its checksum byte so FFmpeg reads the captions
    • Text panel: word navigation ignores a selection the transcript no longer has
    • Slide: keep reversed neighbours' source ranges correct
    • #323: AAF files open in readers that load the meta-dictionary
    • Keep selected audio streams distinct in AAF/OMF exports
    • interchange: fix file:// URLs for Windows verbatim paths (FCP7 XML media offline in Premiere)
    • Export sequence markers to a spreadsheet-safe CSV
    • #447: HybridDecoder fallback replay goes on past samples the software decoder rejects
    • fix(export): Selection as Project exports a selected bin's contents
    • Issue #545: captions.list with a track that names no caption track is an error
    • MCP render_frame: max_side 0 means no limit
    • Keep frame navigation precise and time arithmetic bounded
    • #219: right-clicking a cut opens the edit point menu
    • Audio plays while scrubbing
    • Audio of video clips: volume in Effect Controls + draggable volume line
    • Preview transition placement while dragging onto timeline clips
    • timeline, monitors: drag the current-time timecode to scrub, click to type a time
    • #484: Enable flips each selected clip on its own
    • Fill graphic shapes and text with a linear gradient
    • ui: add an eyedropper to colour parameters (Ultra Key, Color Key...)
    • graphics: shape commands document seconds / track / time, and placement errors name the command that asked
    • Project files: each sequence reopens with its playhead where it was left
    • Implement scrollable areas for media dialog
    • i18n: the tl! source scan in tests passes on CRLF checkouts
    • Text panel: tab widths follow the drawn label (Japanese tabs overlapped)
    • i18n: Japanese for the whole interface
    • Fix Light theme inconsistencies
    • #474: VA-API decoders share one display (no 0.3 s open / 70 ms close per decoder on NVIDIA)
    • M-HW: NVENC takes the export's RGBA and converts it on the GPU
    • Issue #552: MP4 and Matroska colour from the bitstream when the container has none
    • #346: the from-source Flatpak includes the CLI and MCP server
    • chore: bump github actions to fix Node 20 deprecation warnings
    • docs: register the MCP server from an installed release
    • Windows: skip AV1 oracle tests when ffmpeg lacks libsvtav1/libdav1d
    • CLI render: report the real reason for an invalid scale instead of no sequence
    • appearance: View > Appearance names the middle theme "Dark", as Settings does
    • i18n: add Ukrainian (uk) interface translation
    • #288: MP4 / MOV pictures are cropped as the file says (H.264 / HEVC cropping, clean aperture)
    • Issue #551: Anamorphic media: honour pixel aspect ratio in placement, monitors and New Sequence From Clip
    • Linux: NVDEC hardware decoding for H.264 and HEVC
    • Add Simplified Chinese (zh) translation
    • Standardise system appearance modes and FilmCraft theme previews
    • FCP7 XML: keep the source channel of split mono audio tracks
    • fix(mcp): media_import schema mirrors file.import
    • Start scalar graph drags at the pointer press position
    • Essential Graphics: Make a property drag one undo step
    • clip.link: pair video clips with overlapping audio clips
    • effects.setParam: choices by name, a keyframe option, and the keyframe count in the result
    • #430, #224: select, edit, delete and resize transitions
    • project: share sequences across edit snapshots
    • [feat] files dropped onto the Timeline are placed there, not just imported. Supports preview too
    • #262: file dialogs list extensions in any capitalisation on Linux
    • cli: make --help print usage successfully
    • WINCI: Repair HEVC timing and CRLF translation validation
    • Playback: fall back to a working output device when the ALSA default cannot be opened
    • linux: install a dev desktop entry so the taskbar shows the app icon
    • Text to Speech narrations: panel, natural voices (Kokoro-82M in pure Rust), click-to-edit
    • GPU export rendering (on by default) and Vignette, Video Limiter, Lumetri Color on the GPU compositor
    • Progress docs per the craftrules standard; re-measure against Premiere Pro 26.5.2
    • Hardening: an AAF weak-reference collection with a zero key size can't exhaust memory
    • CFB: bound the DIFAT and FAT chain walks by the file's own size
    • fix(i18n): prefer Japanese system glyphs over Chinese fallback
    • Keyboard slip: clamp linked clips by one shared delta
    • Reject unknown mcp options instead of silently ignoring them
    • Audio Clip Mixer: click the dB readout to type a volume
    • #402: WebM transparency (VP9 alpha in BlockAdditions)
    • Trim Monitor: Make trim drags no longer deadlock
    • Export: CRF (constant quality) for H.264
    • Export: never crash on WAV/AIFF over 4 GiB; stream PCM to disk
    • project panel: drag in empty space to marquee-select, in List, Icon and Freeform views
    • timeline, project panel: paste images and copied files from the system clipboard
    • Let a bin be cleared from its context menu, the trash button, the panel menu and Delete
    • Space out browser downloads so image-sequence exports are not dropped
    • ui: reject software rasterizers for GPU compositing and say so
    • MP4: read the start timecode from a Sony rtmd track when there is no tmcd
    • perf(export): index the bin tree once in closure() (#536 follow-up)
    • #456: Select All in the Project panel takes only the shown bin
    • #412: select a single keyframe in Effect Controls
    • #480: exports no longer stop for good when a clip's decoding uses rayon (rotated iPhone HEVC clips)
    • #461: interchange import links media through the streaming reader
    • #333: Fade In and Fade Out presets add up on one clip
    • #457: Settings > Appearance > UI Scale
    • platform: look up kVTCompressionPropertyKey_ConstantBitRate at run time
    • Pass Hard Limiter look-ahead into the DSP limiter
    • Apply Ultra Key Setting as a parameter preset
    • Add file.import replace mode for empty-project round-trips
    • Apply Transform shutter angle when the override is on
    • #239: Position keyframes get the value and velocity graphs
    • Preserve individual linked-clip selections when deleting media
    • Keep Link Media actions accessible for large lists and long paths
    • fix(monitor): make Button Editor customize transport controls
    • feat(timeline): rename video and audio tracks from their headers
    • #680: Shift+Delete ripple deletes with the Timeline focused
    • #279: WAV opens in place and reads only the samples asked for
    • #659: macOS app may use the microphone for voice-over
    • #67: media files share a bounded pool of open descriptors
    • #614: Head, Head and Tail and Continuous video thumbnails in the Timeline
    • timeline, text editing, program monitor: clicking empty space deselects
    • #313: J/K/L shuttle the Source monitor both ways at up to 8x
    • #411: importing a folder keeps its structure as bins
    • timeline: lines between the tracks, a short playhead head
    • fix(captions): reject overflowing TTML times and round extreme clocks safely
    • fix(captions): preserve literal angle brackets in EBU STL export
    • Captions: render the track font and add a font picker
    • settings: the hex colour field takes typing
    • Captions: delete caption tracks from the timeline and Delete Tracks dialog
    • fix(tts-text): preserve amounts and numeric units in narration
    • fix(edl): retain named audio crossfades when importing EDL
    • #709: --gpu-rendering takes a space-separated value
    • #714: an MP4 without an edit list starts at its first picture
    • #721: 5.1 AAC imports decode in WAV/SMPTE channel order
    • graphics: shape handles change the shape's Size, Shift keeps the ratio
    • Fix silent WAV sample-rate substitution
    • fix(settings): mark inactive Timeline focus preference as unwired
    • #710: --version works after global options
    • #591: named clips that cannot stand in for a selection say why
    • #642: open Help/About links in the system browser on the desktop
    • #653: a dragged trim edge stops at the end of the media
    • #284: reset buttons keep keyframes; a reset button on every property
    • effect controls: row lines, a draggable divider, scrolling anywhere, larger keyframes
    • HW5: AV1 sequence headers compare by picture format, so SVT-AV1 files stay on hardware
    • #712: keyboard Slide keeps linked picture and sound aligned at a neighbour limit
    • #695: Timeline markers can be picked and cleared
    • appearance: the Highlight Color drives the playhead, timecodes and focus
    • #715: a Matroska remux that keeps its timestamps starts at its first picture
    • #719: positive Roundness rounds the Lumetri vignette
    • #456: a new bin asks for its name
    • #620: Project Notes panel, saved in the project
    • #456: a bin can be dragged into another bin and back out
    • #227: Lumetri presets can be dragged onto a Timeline clip
    • #483: media dropped past the last track goes on a new track
    • #227: transitions travel with the clips they sit on when moved
    • Project panel: double-click anywhere empty in Icon view opens Import
    • #374: trim preview keeps the waveform in place instead of squeezing it
    • Treat media extensions as case-insensitive on import
    • #342: ProRes 4444 and 4444 XQ export, with alpha
    • #648, #668: select a gap in the Timeline and close it with Delete (Ripple Delete)
    • i18n: add German (de) interface translation
    • feat: Add Russian (ru) localization
    • #374: a clip's fades follow its edges on a regular trim
    • #228: Export Frame reports a frame still loading instead of saving it blank
    • #266: quitting with unsaved changes asks to save first
    • #284: panel menu Maximize Frame can be restored; an empty dock reopens panels
    • GPU export: a frame planned as one CPU image skips the renderer pool (Auto was slower than Off)
    • GPU export: a CLI built on its own exports on the CPU instead of failing
    • #626: undecodable video shows the MEDIA UNREADABLE slate, not black
    • #313: the Source monitor remembers its clips; Close and Close All
    • program monitor: drag a rectangle's corners round with on-canvas corner handles
    • #313: double-clicking a Timeline clip opens it in the Source monitor
    • codecs: an open GOP's leading pictures decode from the GOP before, not as black frames
    • Media: Automatically refresh growing files works (and catches re-renders)
    • HW6: AV1 export format, enabled where a hardware encoder registers one
    • text: the CJK system-font search no longer keeps every probed font file in memory
    • Timeline: draw each audio track's own waveform, not track 1's
    • Linux: H.265 export through NVENC
    • #781: cargo xtask parity measures menu coverage
    • #424: Render In to Out renders only the frames between In and Out
    • #647: decode E-AC-3 (Dolby Digital Plus) audio
    • #779: export JPEG, Targa and DPX image sequences
    • #780: Optical Flow time interpolation synthesises motion-compensated frames
    • Timeline: Option-drag copies clips instead of moving them
    • #577: Effect Controls shows a selected transition's own timeline
    • fix(menus): show configured label colors in Edit menu
    • fix(playback): keep audio during forward shuttle speeds
    • #498: French (fr) interface translation
    • #800: MP2 audio in MP4 and MOV decodes instead of playing silent
    • #805: Morph Cut morphs along optical flow instead of cross-dissolving
    • #806: export OpenEXR image sequences
    • Clear leftover item selection when making a new bin
    • monitors: the wheel zooms about the pointer, the middle button pans
    • #813: masks round their corners (rounded rectangle masks)
    • #821: import Targa and DPX stills and image sequences
    • #814: AAC Audio export (audio-only .m4a, or ADTS .aac)
    • Release prep: 0.6.0 and a Linux riscv64 release build
    • @digitaldecaycreations-lgtm made their first contribution in
    • @vbasky made their first contribution in
    • @maxm11 made their first contribution in
    • @LloydNicholson made their first contribution in
    • @ossini made their first contribution in
    • @ReReddo made their first contribution in
    • @liangforstudy made their first contribution in
    • @Guilhermeb-Ferrarezi made their first contribution in
    • @maccagnit made their first contribution in
    • @chuygarcia92 made their first contribution in
    • @haranishi made their first contribution in
    • @adurr21 made their first contribution in
    • @MasakatsuFunaki made their first contribution in
    • @dylanmtaylor made their first contribution in
    • @sawizzle made their first contribution in
    • @dmatviichuk made their first contribution in
    • @SilentYeti made their first contribution in
    • @hadmark made their first contribution in
    • @luniiya made their first contribution in
    • @gyroninja made their first contribution in
    • @Hathor875 made their first contribution in
    • @David-T-Campos made their first contribution in
    • @mitchmckinstry made their first contribution in
    • @jnohclee-rgb made their first contribution in
    • @ahmedhosnypro made their first contribution in
    • @mutombopr made their first contribution in
    • @Ni-zav made their first contribution in
    • @4papuce made their first contribution in
    • @vangel76 made their first contribution in
    • @abdelkabirouadoukou made their first contribution in
    • @impostazioni made their first contribution in
    • @keller-lukas made their first contribution in
    • @ivandrozdov1505-coder made their first contribution in
    • @alex-brazh made their first contribution in
    • @KattKnight made their first contribution in
  9. 0.5.0Big update

    • fix: filmcraft-cli exits quietly on broken pipe
    • #341: CLI export message names the file written, not the requested path
    • chore(lints): satisfy strict workspace Clippy on Rust 1.95
    • #379: preset export and import go through the host, so the web build no longer traps
    • #340: FCP7 XML clip source span always matches its record span
    • #318: a reversed clip shows exactly its source range
    • fix: frame stepping broken for non-standard frame rates
    • #382: File > Export entries work from the menus
    • #259: the edge you press is the edge you trim
    • macOS DMG: branded window background and icon layout
    • HW5: Linux VA-API hardware decoding for H.264 and HEVC (Main / Main 10)
    • #214: install script for the Linux tarball
    • Desktop: write log records to standard error and a rotating log file
    • M10: keep combining marks in one vertical text cell
    • M10: use Japanese vertical forms and origins for titles
    • Issue #139: portable.txt next to the exe keeps the data directory beside it
    • Go to In / Go to Out move to the sequence start / end without marks
    • Program monitor: the picture follows a value that is dragged
    • Keyframes: Properties gets Premiere's navigator, Effect Controls a time ruler
    • #220: Unlink leaves only the right-clicked clip selected
    • shortcuts: Delete clears the selected timeline clips
    • engine: project.delete takes explicit bin ids without a Project-panel selection
    • fix(import): use the open Project bin as destination
    • Decode caches: navigation bursts no longer keep every clip's decoder and frames
    • Thumbnails decode with small decoders that are not kept
    • fix(gpu): normalize YUV code ranges independently of texture scaling
    • Embedding: set_context on the web app, header and status bar flags, status bar colour token
    • Windows: export paths expand ~, accept trailing \ and verbatim paths
    • #296: Auto-Match measures a mono clip as one channel
    • mixer: report only the audio gains actually applied
    • graphics: keep duration separate from timeline placement
    • MCP: cancelling a movie export keeps numbered files beside it
    • export: keep alpha in PNG/TIFF sequences (Include Alpha Channel)
    • #230: jobs time themselves with web_time, so Create Proxies and mask tracking don't panic on the web
    • #197, #193: web recovery retries failed snapshot writes and keeps skipped snapshots dirty
    • Windows: platform modifier names in status-bar and mask hints
    • platform: ask for the hardware HEVC encoder in the background at startup
    • #236: audio in MKV and OBS-remuxed MP4 plays without crackling
    • fix(web): preserve distinct same-name media imports
    • Sequence ▸ Sequence Settings… opens Premiere's dialog
    • control: Ctrl+ chords through ui.key fire shortcuts off macOS
    • CI: gpu test uses as_chunks (clippy on Rust 1.99)
    • Fix #179: leave OpenGL out of the Windows wgpu instance (Vulkan | DX12 by default)
    • Windows: NVENC H.265 (HEVC) Main hardware encoding for Export
    • README: install on Gentoo from the ::snakebyte overlay
    • export: free the frame pool when an export ends
    • LINUX.VALIDATION: honor preset shortcuts and retain every MPEG oracle timestamp
    • perf(web): feed WebCodecs YUV planes to the shared compositor
    • GPU.EFFECT_SOURCE: preserve exact texel centers for effect inputs
    • i18n: Spanish for the whole interface, catalog files and a remembered language
    • perf(gpu): composite Push transitions on the shared GPU path
    • WINCI: Fix Windows paths and portable validation (#337 by @cshapiro)
    • WINCI: Fix Windows paths and portable validation
    • Windows: NVENC H.265 Main 10 HDR (PQ / HLG) export
    • Export: stage timings in perf.stats, and render the next batch while encoding
    • M3.12: Source playback, clip dragging and monitor range editing (#338 by @cshapiro)
    • M3.12: Source playback, clip dragging and monitor range editing
    • platform: enable existing NVENC H.264 export on Linux
    • M3.12: Export frames from Source and Program monitors (#353 by @cshapiro)
    • M3.12: Export frames from Source and Program monitors
    • New Sequence… opens the Sequence Settings dialog as New Sequence (stacked on #422)
    • Sequence Settings: Sequence Name on the General tab (follow-up to #355)
    • CI: gpu Push test uses as_chunks (clippy on Rust 1.99)
    • feat(media, engine): implement multi-stream container audio support and schema v13
    • Fix Chinese glyph rendering in native timeline and UI labels
    • @mjohnson7cd made their first contribution in
    • @JordyUSA made their first contribution in
    • @WavJaby made their first contribution in
    • @MarekSpodBiedry made their first contribution in
    • @txiki739 made their first contribution in
    • @ItzBloxy made their first contribution in
    • @XusBadia made their first contribution in
    • @switch87 made their first contribution in
    • @MrCloudy2 made their first contribution in
    • @wstock made their first contribution in
    • @rossaai made their first contribution in
    • @Tom1tk made their first contribution in
    • @Pathos0925 made their first contribution in
    • @IppSec made their first contribution in
    • @swillunderscore made their first contribution in
    • @sanyamsingh001 made their first contribution in
    • @cshapiro made their first contribution in
    • @wisegamesyt-droid made their first contribution in
    • @jerrykimo made their first contribution in
  10. 0.4.0Big update

    • Windows on ARM64: release builds, PE header check, install test on ARM64 hardware
    • codecs: resampled MP4 audio reads apply the edit list once
    • engine: file.exportInterchange refuses an unknown format
    • interchange: an export names every title it cannot carry
    • engine: a project saved after an interchange import opens again
    • engine: sequence.inspect reports clip ends, gain and marker comments
    • engine: sequence.inspect reports a reversed clip
    • engine: clip.replaceFromBin can keep the clip's source In
    • engine: Replace With Clip reports clips that run past the new media
    • engine: a command whose targets are named in the parameters does not need a selection
    • filmcraft: --help prints usage and an unknown option is an error
    • engine: naming a track that does not exist is an error
    • engine: timeline.place on an audio track places the sound there
    • engine: timeline.move takes linked partners along
    • edit: a ripple trim takes a later split edit along
    • edit: ripple delete closes one gap for a clip with a split edit
    • edit: a speed change with ripple moves later clips once
    • i18n: Japanese interface language (uses an installed system font)
    • MEM1–MEM4 + HW1: clip memory on a timeline from 12 GB to 1.9 GB; hardware decode actually on
    • Docs: hardware decode correction; log the 2026-10-06 community batch
    • Fonts: use craft-fonts as an optional build input (Japanese UI and title fallback)
    • Tests: fix seed_sweep overflow and the speed-dependent export progress test
    • interchange: an FCP7 master clip lands in its bin when a sequence used it first
    • project: Clear deletes a bin it is given, with everything in it
    • timeline.move: report the clips an overwrite move covers
    • codecs: look video frames up by the nearest timestamp unit (WebM at 30 fps drops every third frame)
    • h264enc: strict ffmpeg oracle that sees damaged slices
    • codecs: an MP4/MOV clip lasts as long as its edit list plays it
    • codecs: MP4/MOV pixel format and alpha come from hvcC, avcC and the ProRes frame header
    • gpu: upload and composite the alpha plane of Y'CbCr frames
    • graphics: all eight layer handles scale towards the pointer
    • Timeline: the wheel scrolls as in Premiere, and the view cannot be lost
    • Packaging: describe FilmCraft, not PhotoCraft, in package metadata
    • i18n: Spanish interface language (Español)
    • Icons: draw straight lines on whole device pixels
    • docs: add star history chart to README
    • Window ▸ Workspaces: save your own workspaces, like Premiere
    • Ripple trim: a shorter head on a J-cut take is no longer refused
    • Ripple trim: a shorter head after an L cut keeps the earlier sound in place
    • Control: close the connection on input that isn't a request
    • Sequence: Add Tracks… opens Premiere's dialog (amount, placement, track type)
    • HE-AAC plays at its output rate; AAC export caps the bitrate (#108, parts 1–2)
    • Audio: mix playback 200 ms ahead so a busy Mac doesn't drop sound
    • Audio: play a sequence on a device at another rate without phase jumps
    • Nested sequences: interchange (AAF compositions, OMF rendered sound, EDL reel AX)
    • NEST4–NEST8: nest toggle, sequences as sources, Reveal in Project, Multi-Camera submenu
    • Timeline: sequence tabs, Premiere-style clip menu, Nest name dialog
    • NEST1–NEST3: nested sequences safety and Premiere-matching Nest (fixes two crashes)
    • Nested sequences: rendering fidelity (sizes, speed, effects, captions, waveforms)
    • Nested sequences: Timeline tabs (view per sequence, tab menu, reorder, restore on open)
    • Codecs: add clean-room APV (RFC 9924) decoder, encoder, container support, and export presets
    • Theme: interface type closer to Premiere's
    • Hardening: hostile MP4 edit lists and cyclic subclip chains
    • Tests: image-sequence oracle fixtures are written atomically
    • MCP: render_frame and render_preview leave the playhead where it was
    • Transcripts: builds without speech-to-text say so
    • Packaging: the rpm requires glibc >= 2.35, as the deb does
    • Bridge: a blocking export runs as an app job, so it neither times out nor freezes the app
    • Transcripts: disabled, not failing, in builds without speech-to-text
    • Docs: releasing guide, CLI export options, README and CLAUDE.md drift
    • Packaging: the Flatpak can read a project's media wherever it lives
    • Web: window.filmcraft rejects with Error objects everywhere
    • Rename PrintCraft to PdfCraft
    • Graphics: point text and paragraph text, as Premiere has them
    • Graphics: only selected layers have a box, and a hidden layer has none
    • Graphics: New Layer from File anchors the picture at its own centre
    • Color Matte: pick the color on creation and change it later
    • h264enc: 1-pass bitrate modes no longer starve the opening second
    • Playback: a stalled audio device no longer freezes the playhead
    • Media Browser: probing a file doesn't read it whole
    • Shortcut recorder accepts modifier chords; Add Edit cuts only selected clips (#164, items 1 and 5)
    • i18n: add Brazilian Portuguese (pt-br) UI translation
    • platform: opt-in hardware H.264 encoding with VideoToolbox
    • render: composite only what overlays cover, and reuse the float images
    • export: show the estimated time left of a render next to its percentage
    • platform: H.265 (HEVC) export with VideoToolbox
    • Engine: project.selectAll and project.deselectAll for the Project panel
    • Windows: Media Foundation/D3D11 hardware H.264 + HEVC decode
    • M10: choose vertical titles from the Type tool flyout
    • Engine: file.import refreshes the offline-missing list
    • Windows: VP9 + AV1 hardware decode (Media Foundation / DXVA)
    • Windows: NVENC H.264 hardware encoding for Export (opt-in)
    • Q/W ripple trim only the selected clips' tracks
    • Ripple delete names the sync-locked track in the way; playhead snaps to cuts (#164, items 2, 3 and snap)
    • Stabilize project lifecycle, timeline, audio and export workflows
    • #199: make Ctrl+C / Ctrl+X / Ctrl+V work on Windows and Linux
    • fix: support integer CPAL devices and recover voice-over/audio failures
    • Web: Link Media Locate… links the chosen file to the selected missing clip
    • #188: regression test — a copied Graphic clip pastes at the playhead
    • fix: validate hostile project, export and MXF inputs
    • About: contributor and model credits compiled in (grab bag + table, self-submitted names)
    • Speed/Duration opens its dialog; dragging an effect parameter is one undo step
    • Release: FreeBSD, Flatpak x86_64/aarch64, AppImage zsync; README Downloads
    • README Downloads: where to get it, then builds (Windows first)
    • @punkhop made their first contribution in
    • @midasdf made their first contribution in
    • @justjohn12345 made their first contribution in
    • @EthanSuquet made their first contribution in
    • @HEOJUNFO made their first contribution in
    • @dcarnelutti made their first contribution in
    • @carlitosteso3 made their first contribution in
    • @coygeek made their first contribution in
    • @Luskish made their first contribution in
    • @mweinbach made their first contribution in
    • @ajsongpilot made their first contribution in
    • @RicSchonfelder made their first contribution in
    • @Luna161 made their first contribution in
    • @SaymonMaster14 made their first contribution in
    • @cirocueto2013-wq made their first contribution in
    • @DWAA1660 made their first contribution in
  11. 0.2.1

    • GPU1: blend modes on the GPU compositor
    • Docs: honest parity assessment (ROADMAP, README, agent docs)
    • HW1: platform crate + VideoToolbox H.264/HEVC hardware decode
    • docs: point agents to the shared test corpora
    • GPU2: standard effects on the GPU compositor
    • Captions: report invalid TTML timing parameters on import
    • Export: same file on every machine (fixed mux interleave, H.264 slices by frame size)
    • MCP: tool annotations, core tools, resources, export progress and cancellation
    • Windows packaging: Start Menu/Add-Remove icon, no console window, correct description
    • Never crash: filmcraft-export without expect()/unreachable!()
    • Release: FilmCraft v0.2.1
  12. 0.2.0Big update

    • Sequences: refuse a zero or negative frame rate instead of panicking
    • Media: apply the container's display rotation (portrait phone video)
    • Timeline: fit a new empty sequence again when its first clip arrives
    • Control: screenshots and ui.elements wait for the UI to settle
    • Licensing: standard LICENSE files, NOTICE, ArtCraft brand terms
    • Media: AIFF files import (enable symphonia's aiff reader)
    • Export: start/end times without a range mean a custom range
    • Timeline: transitions stay on their cuts after ripple trim, roll, slide and ripple speed
    • Timeline: Slide moves linked audio with the video
    • Rules: never crash (AGENTS.md §0, clippy.toml, forbid unsafe)
    • time: never crash (zero rates and timebases, huge timecodes)
    • vp9: never crash (no unwrap/expect/panic, deny them)
    • h264: never crash (no unwrap/expect, deny the panicking lints)
    • hevc: never crash (no unwrap/expect, deny the panicking lints)
    • av1: never crash (no expect, deny the panicking lints)
    • Containers: never crash (mpegts, ogg, mxf, matroska)
    • Codecs: never crash (ac3, audio-dsp, opus, mpeg2v, prores, dnx)
    • codecs: never crash (damaged MP4/TS headers; no expect/unreachable)
    • Importers: never crash (interchange, captions, project, text, automation)
    • h264enc: never crash (encode returns Result; no unwrap/expect/unreachable)
    • render, gpu, cli: never crash (no expect/unreachable, deny the panicking lints)
    • engine, edit: never crash (commands without expect/unwrap/panic)
    • engine: last-resort guard around commands and background jobs
    • ui-egui: never crash (panels without expect/unreachable)
    • Never crash: deny the panicking lints in the already-clean crates and apps
    • Release: FilmCraft v0.2.0
    • @storybored379 made their first contribution in
    • @echelon made their first contribution in
  13. 0.1.1

  14. 0.1.0