- 在 Linux 桌面上做正式剪辑:Premiere 没有 Linux 版,Resolve 的 Linux 版对硬件和授权有额外门槛,这个项目原生跑在 Metal/Vulkan/DX12 上,是少数能当主力时间轴用的开源选项
- 需要帧率精确的素材(23.976/29.97 丢帧、混合帧率时间轴):时间轴用整数 tick 而非浮点秒,长序列不会累积漂移,浮点时间轴的编辑器在这类工程里要反复手动对齐
- 把剪辑流程交给脚本或代理驱动:所有操作都是命令,可被外部程序精确重放,做批量套模板、自动粗剪这类流水线时不用去逆向 GUI 自动化
- 在浏览器里做轻量预览或协作审片:WebAssembly 版本省掉装客户端,代价是走 WebGPU 路径,和原生版不是同一套运行环境
filmcraft
storytoldApache-2.0活跃维护 有专家点评用纯 Rust 从零实现的开源非线性视频编辑器,支持多轨道剪辑与视频处理,适合想要轻量、高性能剪辑工具的用户。
FilmCraft: An open-source, nonlinear video editor written from scratch in pure Rust
专家点评
上手难度:硬核更新于 2026-11-11纯 Rust 自研编解码与 GPU 合成的非线性剪辑器,顶替 Premiere/Resolve 在 Linux 和浏览器里的位置
适用场景
踩坑
- 硬件加速是 issue 区反应数最高的一条(GPU/媒体引擎解码、GPU 特效、GPU 导出),说明当前解码和导出很可能仍以 CPU 路径为主;拿它剪 4K 多轨或长 GOP 素材前,先确认你的工作流是否依赖硬解硬编
- README 没给构建命令和依赖版本,自研编解码器意味着要自己处理各平台的多媒体工具链;从 clone 到能跑大概率要读文档甚至翻源码,别按「cargo build 就好」预期
- 项目自述年轻且快速迭代,接口与行为会变;工程文件格式和命令接口在升级时可能不兼容,长期项目要锁版本并自己留导出备份
同类对比
要成熟稳定的商业级调色与交付链选 DaVinci Resolve;要 Linux 上久经使用、插件生态完整的开源方案选 Kdenlive 或 Shotcut。这个项目的分流点是「纯 Rust 自研栈 + 命令化可编程 + 浏览器运行」,这三点你不需要就没必要承担它的迭代风险。
README 未给出安装或构建命令README 未说明具体显存或 GPU 型号要求;GPU 合成器基于 wgpu,支持 Metal、Vulkan、DirectX 12 与 WebGPU,并提供 CPU 渲染路径。
项目说明
由 README 自动翻译提炼纯 Rust 从零编写的开源非线性视频剪辑器,跨平台原生运行并支持浏览器 WebAssembly
用纯 Rust 从零实现的开源非线性视频编辑器,支持多轨道剪辑与视频处理,适合想要轻量、高性能剪辑工具的用户。
核心能力
- 自研 H.264/HEVC/ProRes/AAC 编解码器,按公开规范用 Rust 实现
- GPU 合成器基于 wgpu,在 32 位线性光下合成并保留 CPU 对照路径
- 时间轴以整数 tick 计算,23.976/29.97 丢帧等帧率精确不漂移
- 完整调色面板含曲线、色轮、HSL 二级与实时波形图矢量图
- 所有操作皆为命令,可被 AI 代理精确驱动
容易踩的坑
README 未说明构建依赖与版本要求;项目自述处于年轻且快速迭代阶段,接口与行为可能变动;浏览器端需通过 WebAssembly 运行,与原生版环境不同
- v0.19.0FilmCraft v0.19.0最新正式版2026-11-09 · 2026-11-09 11:54 UTC
What's Changed
- Effect Controls: Scale Width is greyed out while Uniform Scale is on (#4381) by @ZIDAN44 in https://github.com/storytold/filmcraft/pull/4407
- filmcraft-web: window.filmcraft takes its request functions from craft-web-api by @helenkwok in https://github.com/storytold/filmcraft/pull/4420
- #65: CommandSpec carries which target keys a command takes by name by @vangel76 in https://github.com/storytold/filmcraft/pull/1413
- audio-dsp: narrow the public API to what other crates use by @vangel76 in https://github.com/storytold/filmcraft/pull/3147
- audio-dsp: phaser, click remover and binauralizer recover from NaN and inf input by @vangel76 in https://github.com/storytold/filmcraft/pull/3149
- h264: intra prediction from a u8 edge line with per-mode loops by @vangel76 in https://github.com/storytold/filmcraft/pull/3180
- perf(h264): dequantise and place residual coefficients while decoding them by @vangel76 in https://github.com/storytold/filmcraft/pull/3184
- ogg: CRC-32 slice-by-16, open() 3-5x faster (#4046) by @vangel76 in https://github.com/storytold/filmcraft/pull/4059
- flac: per-order predictor kernels and merged partition sums, encoding ~1.6x faster, output byte-identical (#4044, #4045) by @vangel76 in https://github.com/storytold/filmcraft/pull/4062
- mpa: faster synthesis filterbank, Layer I/II decode ~2.5x faster, output bit-identical (#4050) by @vangel76 in https://github.com/storytold/filmcraft/pull/4063
- ogg: keep demuxing past many damaged pages, warn when recovery gives up (#4047) by @vangel76 in https://github.com/storytold/filmcraft/pull/4065
- ogg: Opus timing no longer overflows on extreme granule positions by @vangel76 in https://github.com/storytold/filmcraft/pull/4067
- ac3: read bits through the shared BitReader instead of one bit at a time by @vangel76 in https://github.com/storytold/filmcraft/pull/4068
- captions: the export dialog lets you choose the caption track (#4060) by @vangel76 in https://github.com/storytold/filmcraft/pull/4220
- Release: refresh contributor credits for each release (#4415) by @Luis-0508 in https://github.com/storytold/filmcraft/pull/4416
- vp9: best-fit buffer pool, no clearing of recycled strip planes and mode info by @vangel76 in https://github.com/storytold/filmcraft/pull/3294
- audio-dsp: crossfade convolution reverb impulse changes by @vangel76 in https://github.com/storytold/filmcraft/pull/3153
- codecs: read 2 KiB instead of 16 KiB of each picture for AVC reordering at open by @vangel76 in https://github.com/storytold/filmcraft/pull/3283
- perf(av1): loop restoration per stripe with row buffers and box sums by @vangel76 in https://github.com/storytold/filmcraft/pull/3116
- perf(av1): full-pel copy path for motion compensation by @vangel76 in https://github.com/storytold/filmcraft/pull/3114
- perf(av1): CDEF on padded rows per 64x64 filter block by @vangel76 in https://github.com/storytold/filmcraft/pull/3110
- chore(av1): remove dead code, the unused bitstream dependency and hand-copied spec tables by @vangel76 in https://github.com/storytold/filmcraft/pull/3108
- New Item and File > New make the item in the open bin by @vangel76 in https://github.com/storytold/filmcraft/pull/4307
- audio-dsp: two channels per complex FFT in the STFT effects by @vangel76 in https://github.com/storytold/filmcraft/pull/3148
- audio-dsp: every effect recovers from one NaN or inf input sample by @vangel76 in https://github.com/storytold/filmcraft/pull/3152
- #1354: Backspace in Effect Controls removes the selected effect, not the clip by @vangel76 in https://github.com/storytold/filmcraft/pull/1400
- Timeline: box selection and Select All include captions (#1912) by @vangel76 in https://github.com/storytold/filmcraft/pull/1962
- Enable Feet + Frames (35mm / 16mm) and Frames display formats by @vangel76 in https://github.com/storytold/filmcraft/pull/3547
- #1065: DNG raw settings, faster decode, opcode lists, lossy JPEG DNG by @vangel76 in https://github.com/storytold/filmc
- v0.18.0FilmCraft v0.18.02026-11-06 · 2026-11-06 20:21 UTC
查看更新说明
What's Changed
- web: check MP4 sample extent before allocating its buffer by @dylanmtaylor in https://github.com/storytold/filmcraft/pull/4102
- avi: hold child chunks to their container so lists cannot overlap by @dylanmtaylor in https://github.com/storytold/filmcraft/pull/4106
- security(dnx): cap decoded frame memory and reject repeated scan line indices by @dylanmtaylor in https://github.com/storytold/filmcraft/pull/4101
- security(apv): size the auxiliary alpha frame only after its tiles decode by @dylanmtaylor in https://github.com/storytold/filmcraft/pull/4109
- web: load only a same-origin http(s) app in the WebCodecs read-error harness by @dylanmtaylor in https://github.com/storytold/filmcraft/pull/4103
- captions: escape a TTML cue's unclosed '<' tail in one pass by @dylanmtaylor in https://github.com/storytold/filmcraft/pull/4105
- interchange: AAF top-level composition carries the registered Usage_TopLevel (#3986) by @JonRC in https://github.com/storytold/filmcraft/pull/3987
- Interchange export: saturate timecodes and PCM fields on hostile project values by @Lightningbulb2 in https://github.com/storytold/filmcraft/pull/4029
- interchange: EDL clips named only by clip name are missing, not made offline (#3997) by @JonRC in https://github.com/storytold/filmcraft/pull/4000
- interchange: EDL media relinked with Align Timecode lands on the file's own time (#3990) by @JonRC in https://github.com/storytold/filmcraft/pull/3996
- interchange: an OTIO item at a sample rate no longer sets the sequence rate (#4111) by @JonRC in https://github.com/storytold/filmcraft/pull/4112
- interchange: EDL and OMF export reports name the video tracks they leave out (#4132) by @JonRC in https://github.com/storytold/filmcraft/pull/4133
- engine: AAF/OMF export takes bitDepth as "24" too, and refuses anything but 16 or 24 (#4019) by @JonRC in https://github.com/storytold/filmcraft/pull/4020
- captions: TTML export writes the track language, import keeps it (#4025) by @JonRC in https://github.com/storytold/filmcraft/pull/4038
- Reject '+'-signed audio channel numbers in EDL import by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3935
- Only decode percent escapes made of hex digits in file URLs by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3936
- Strip leading BOM in WebVTT parse even without a signature by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3961
- Read TTS fractions with denominator 1 as "over one" by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3983
- Fix per-character Stroke and Stroke 2 appearance controls by @wweimao in https://github.com/storytold/filmcraft/pull/3938
- captions: SCC and MCC export name the characters they drop or replace (#4023) by @JonRC in https://github.com/storytold/filmcraft/pull/4036
- i18n(ru): translate the 64 strings the missing-translations report listed (#1674) by @rahul05ranjan in https://github.com/storytold/filmcraft/pull/3960
- i18n(zh-cn): translate the 41 strings the report listed as missing by @rahul05ranjan in https://github.com/storytold/filmcraft/pull/3964
- codecs: an MP4 edit rounded to the movie timescale keeps the last frame by @Agapenordev in https://github.com/storytold/filmcraft/pull/3994
- lumetri.presetThumbnails: write through the host and keep the grid to the presets by @Lightningbulb2 in https://github.com/storytold/filmcraft/pull/4030
- Name Apple Intermediate Codec and show why a clip is unreadable (part of #3646) by @scks1 in https://github.com/storytold/filmcraft/pull/4010
- cli: a missing project stops a save in place before it opens by @JonRC in https://github.com/storytold/filmcraft/pull/3946
- Import by a relative path: '..' climbs out of the document folder, and media paths are resolved once (#3998, #4001) by @JonRC in https://github.com/storytold/filmcraft/pull/4004
- essentialSound.set: ducking.against takes the type names setType takes by @JonRC in https://github.com/storytold/filmcraft/p
- v0.17.1FilmCraft v0.17.12026-11-05 · 2026-11-05 01:47 UTC
查看更新说明
Full Changelog: https://github.com/storytold/filmcraft/compare/v0.17.0...v0.17.1
- v0.17.0FilmCraft v0.17.02026-11-03 · 2026-11-03 00:53 UTC
查看更新说明
What's Changed
- Ignore leading byte order mark in SRT parser by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3781
- Read sub-dollar amounts without a zero major unit in TTS by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3783
- i18n(sv): translate 49 new strings by @kler in https://github.com/storytold/filmcraft/pull/3784
- Reject zero, negative and non-finite FPS in ALE import by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3790
- Refuse non-finite curve coordinates in effects.setParam by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3792
- Play/Stop once per Space press, not on key repeat by @marshiyar in https://github.com/storytold/filmcraft/pull/3795
- Timeline: the playhead glides during playback instead of jumping a frame at a time by @marshiyar in https://github.com/storytold/filmcraft/pull/3806
- Export: the time left counts down between batches; the status bar shows it once a second, in place by @kler in https://github.com/storytold/filmcraft/pull/3816
- Clamp negative EDL dissolve/wipe durations to 0 on import by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3827
- Handle sub-two 3D LUT sizes by @TheGalitube in https://github.com/storytold/filmcraft/pull/3839
- fix(ui): a project file dropped on the window opens it (#3843) by @mpratsaki in https://github.com/storytold/filmcraft/pull/3854
- fix(ui): the Project panel's Zoom sizes List thumbnails and the Freeform canvas (#3774) by @mpratsaki in https://github.com/storytold/filmcraft/pull/3871
- Serialize bridge render_frame calls so parallel requests get their own frame (#3837) by @MarekSpodBiedry in https://github.com/storytold/filmcraft/pull/3872
- Effect Controls: double-clicking a property's name resets it by @infinityespi in https://github.com/storytold/filmcraft/pull/3735
- text: count trailing spaces at a hard line end into the alignment width by @marshiyar in https://github.com/storytold/filmcraft/pull/3743
- ui: say where the project was saved in the status bar by @marshiyar in https://github.com/storytold/filmcraft/pull/3744
- effects: give 4-Color Gradient a position for each colour by @marshiyar in https://github.com/storytold/filmcraft/pull/3747
- Focus the Source monitor when a clip is opened in it (#3669) by @marshiyar in https://github.com/storytold/filmcraft/pull/3749
- Bokeh Blur: gather through a kernel of whole-pixel weights, 5x faster on the GPU by @kler in https://github.com/storytold/filmcraft/pull/3768
- History: each step shows the icon of the tool or command that made it by @dotCooCoo in https://github.com/storytold/filmcraft/pull/3776
- fix(graphics): Style buttons show and toggle the Type-tool selection by @alexanderalber in https://github.com/storytold/filmcraft/pull/3673
- G13: TikTok, Instagram Reels and YouTube Shorts export presets by @mpratsaki in https://github.com/storytold/filmcraft/pull/3721
- dng: bound lossless-JPEG decoding by the data it has and reject shared tile bytes by @marshiyar in https://github.com/storytold/filmcraft/pull/3680
- Luma Key: key out brights by @marshiyar in https://github.com/storytold/filmcraft/pull/3688
- Apply background mask tracking in headless sessions by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3303
- Parse AVI stream numbers as decimal by @TheGalitube in https://github.com/storytold/filmcraft/pull/3603
- ui: media browser test re-maximizes after Shift+O opens Source by @echelon in https://github.com/storytold/filmcraft/pull/3897
- engine: mask discard test checks the cancel flag, not the worker's timing by @echelon in https://github.com/storytold/filmcraft/pull/3899
- fix(ui): Save Arrangement refuses an unknown bin (#3774 follow-up) by @mpratsaki in https://github.com/storytold/filmcraft/pull/3900
- cli: --save runs on one project take turns, so no edit is lost by @JonRC in https://github.com/storytold/filmcraft/pull/3926
- Read decades like 1990s as plural years in TTS normalizer by
- v0.16.0FilmCraft v0.16.02026-11-01 · 2026-11-01 19:26 UTC
查看更新说明
What's Changed
- Updates: shared check-result dialog from craft-update by @aiongg in https://github.com/storytold/filmcraft/pull/3756
- docs: tidy agent, contributor and asset docs by @aiongg in https://github.com/storytold/filmcraft/pull/3755
- Integration: backlog round r1 (244 PRs) by @aiongg in https://github.com/storytold/filmcraft/pull/3746
- Keep a clip's transitions when copying and pasting it by @Silvertree2010 in https://github.com/storytold/filmcraft/pull/3473
- fix(export): a failed encoder factory does not stop the next one (#936) by @ComfyChloe in https://github.com/storytold/filmcraft/pull/3475
- fix(#issue3): loop button highlights when looping is active by @dknalp in https://github.com/storytold/filmcraft/pull/3486
- docs(#2645): document numpad key limitation and workarounds in keyboard.md by @dknalp in https://github.com/storytold/filmcraft/pull/3516
- Tests: split the NVENC error test so clippy's complexity limit passes on Windows by @dotCooCoo in https://github.com/storytold/filmcraft/pull/3566
- Platform: the macOS and Windows encode tests build again by @marshiyar in https://github.com/storytold/filmcraft/pull/3580
- Trim: a graphic, still or adjustment layer extends from its left edge by @marshiyar in https://github.com/storytold/filmcraft/pull/3582
- Timeline: the box selection stays on the clips while the view scrolls by @marshiyar in https://github.com/storytold/filmcraft/pull/3583
- Timeline: double-clicking a marker opens an Edit Marker dialog by @marshiyar in https://github.com/storytold/filmcraft/pull/3585
- media-browser: list AAF and OMF documents, which File ▸ Import already reads by @noesis-bot in https://github.com/storytold/filmcraft/pull/3615
- Preserve multiline WebVTT cue identifiers by @TheGalitube in https://github.com/storytold/filmcraft/pull/3664
- Reject out-of-range EBU STL timecodes by @TheGalitube in https://github.com/storytold/filmcraft/pull/3665
- ogg: charge bad-CRC page reads to the recovery budget by @marshiyar in https://github.com/storytold/filmcraft/pull/3681
- platform: macOS test fixes (boxed MediaClip, HEVC probe test in its own binary) by @kler in https://github.com/storytold/filmcraft/pull/3683
- Render Effects In to Out renders only red segments, like Premiere (#1220) by @kler in https://github.com/storytold/filmcraft/pull/3684
- ProRes encoder: rate control starts from the previous frame's quantiser, 2x faster 4K encode (#1220) by @kler in https://github.com/storytold/filmcraft/pull/3685
- Graphics: document what Responsive Design – Time remaps by @marshiyar in https://github.com/storytold/filmcraft/pull/3690
- Panels: a floating panel's menu opens in its own window by @marshiyar in https://github.com/storytold/filmcraft/pull/3693
- Color: add a Three-Way Color Corrector by @marshiyar in https://github.com/storytold/filmcraft/pull/3695
- Effects panel: Set as Default Transition by @marshiyar in https://github.com/storytold/filmcraft/pull/3696
- Graphics: gradient stops can carry opacity by @marshiyar in https://github.com/storytold/filmcraft/pull/3701
- UI: Thai fallback font for file and clip names by @marshiyar in https://github.com/storytold/filmcraft/pull/3702
- Select the whole value when a single-line text field gains focus (#3655) by @MarekSpodBiedry in https://github.com/storytold/filmcraft/pull/3707
- docs: transcripts: word bounds are only moved across pauses by @tdog37 in https://github.com/storytold/filmcraft/pull/3718
- Export: background jobs read their own copy of each file, so playback keeps its decoder by @kler in https://github.com/storytold/filmcraft/pull/3723
- Media: the per-frame growing-files check no longer lists every media file by @kler in https://github.com/storytold/filmcraft/pull/3729
- ime: read the viewport id outside the context lock by @marshiyar in https://github.com/storytold/filmcraft/pull/3731
- tests: a_single_frame_source_range waits for the wall clock instead of racing it by @marshiyar in https://github.com/storytold/film
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
[!NOTE] ArtCraft is a community of artists from all walks of life. Digital, generative, music, games — if you make things, you're one of us. Come say hi on Discord.
FilmCraft is a professional non-linear editor: familiar panels, workspaces, tools and shortcuts, so your hands already know where everything is. Underneath, it is new from the bitstream up. The H.264, HEVC, ProRes and AAC codecs are our own, written in Rust from the public specifications. A GPU compositor works in linear light. Frame math runs on exact integer time, so edits never drift. And every action in the app is a command that an AI agent can drive as precisely as you can.
Edit
A timeline you already know. Source and Program monitors, bins with thumbnails, a multi-track timeline with patch and target buttons, sync locks and linked selection. The Editing, Assembly, Color, Effects and Audio workspaces are all there, and every panel docks wherever you want it.
- Three-point editing. Mark In and Out in the Source monitor, then insert (
,) or overwrite (.) onto the patched tracks. Lift (;) and extract (') take ranges back out. - Every trim. Ripple, roll, slip, slide, rate stretch and razor tools. Trim mode selects edit points as ripple, roll or trim, nudges them a frame at a time (
⌥←⌥→, ×5 with⇧), toggles the trim type with⌃Tand extends them to the playhead withE.QandWripple-trim to the playhead. The Trim Monitor shows both sides of the edit, and dynamic trimming trims live while it plays:Lforward,Jback,Kto stop and commit as one undo step. - Exact time. Every edit is computed on integer ticks: 254,016,000,000 per second, which divides evenly by every common frame rate and sample rate. 23.976, 29.97 drop-frame and 59.94 are exact, not approximate.
- The details pros rely on. Markers with colours, names and durations; export sequence review notes with Markers ▸ Export Markers as CSV…; add edit (
⌘K) on one or all tracks; nesting; copy, paste and paste insert; ripple delete and close gap; snapping; unlimited undo with a History panel. - Your keys. A Keyboard Shortcuts editor (
⌥⌘K) with a drawn keyboard, panel-specific shortcuts, conflict warnings and presets for FilmCraft and standard NLE key layouts. - Never lose work. Saves are atomic, auto-save keeps a rolling set of versions, and a crash-recovery journal written about a second after each edit brings back unsaved changes after a crash or power cut.
Color
A complete color grading panel, in the order a colourist works:
- Basic Correction: temperature and tint, exposure, contrast, highlights, shadows, whites, blacks, saturation.
- Creative: eight built-in looks with an intensity control, plus faded film, sharpen and vibrance. The looks are colour transforms written in code, not LUT files.
- Curves: an RGB curve editor with monotone-cubic interpolation (no overshoot), and hue vs saturation, hue vs hue, hue vs luma, luma vs saturation and saturation vs saturation.
- Color Wheels: shadow, midtone and highlight wheels, each with its own lightness control.
- HSL Secondary: key a colour by hue, saturation and luma, view the key as a matte, and correct only what you selected.
- Vignette: amount, midpoint, roundness and feather.
Effects and motion
- A comprehensive Video Effects bin (over 90 effects across 16 categories), legacy effects, plus around 30 transitions. Blurs (Bokeh, Focus, Compound), keys (Ultra Key, Track Matte), distortions (Corner Pin, Turbulent Displace, Warp Stabilizer), Lights & Glows, Immersive Video (VR) effects on equirectangular footage, Posterize Time, Echo and more. Cross dissolve, dip to black or white, film dissolve, wipes, irises, pushes, slides, zooms, page peel, cube spin and more.
- Motion and opacity on every clip: position, scale, rotation, anchor point and anti-flicker, plus 26 blend modes.
- Advanced keyframing: linear, Bezier, auto and continuous Bezier, hold, ease in and ease out. Effect Controls shows a keyframe lane for every parameter under a time ruler with the playhead's handle, and each animated parameter opens into value and velocity graphs with draggable influence handles. Effect Controls and the Properties panel share the keyframe navigator (◀ ◆ ▶): add or remove the keyframe at the playhead, step to the previous or next one.
- A GPU compositor built on wgpu (Metal, Vulkan, DirectX 12, WebGPU). It samples YUV straight from the decoder with footprint supersampling and blends in linear light. A CPU path renders the same frames, and the two are tested against each other.
Audio
- Loudness meters to broadcast standards. Momentary, short-term and integrated loudness and true peak to ITU-R BS.1770 and EBU R128, alongside the peak meters. Our integrated reading matches ffmpeg's
ebur128filter to the tenth of a LU. - Clip effects on our own DSP library: parametric EQ, high-pass, low-pass and band-pass filters, dynamics, a true-peak limiter, delay, reverb, DeNoise, DeHummer, invert and pitch shift. Parameters can be keyframed. Effects stay continuous across scrubbing, playback and export, with latency compensated.
- Audio Track Mixer and Audio Clip Mixer: faders, pan, mute, solo, five insert slots per track (pre- or post-fader), sends, submixes and a Mix track, all sample-accurate and latency-compensated. 24 tracks with three effects each mix about six times faster than real time on one core.
- Automation like a console: Read, Latch, Touch and Write modes recorded live from the mixer during playback, shown and edited as track keyframes on the timeline. Plus the Audio Gain dialog (set, adjust, normalize) and constant-power crossfades.
- Audio-clock playback. The sound card is the master clock, so picture follows sound and never the other way round.
Titles and captions
- A real text engine: OpenType shaping with kerning and ligatures, bidirectional text, line breaking, tracking and leading, drawn in linear light and sharp at any scale or rotation.
- Type, Shape and Pen tools on the Program monitor: click to type, edit with a caret and selection, drag out rectangles, ellipses and paths. Graphic clips hold text and shape layers with fill, strokes, background and shadow, all keyframable, and edited in the Properties panel.
- Captions: caption tracks in Subtitle, CEA-608, CEA-708 and Teletext formats; import and export SRT, WebVTT and SCC with frame-exact timing; edit captions in the Text panel and burn them into exports.
Formats and codecs
No FFmpeg inside. The video codecs, AAC, Opus and the containers are our own Rust code, implemented from the public ITU-T, ISO and IETF specifications and tested frame by frame against ffmpeg as an external oracle.
| Decode | Encode | Notes | |
|---|---|---|---|
| H.264 / AVC | ✓ | ✓ | Decoder bit-exact on 37+ streams, 500–600 fps at 1080p. Encoder: High, Main and Baseline profiles, CABAC, B-frames, CRF/CBR/VBR/2-pass |
| HEVC / H.265 | ✓ | Main and Main 10, bit-exact on 41 streams (tiles, WPP, PCM, long-term references), about 225 fps at 1080p | |
| Apple ProRes | ✓ | ✓ | Decodes 422 Proxy to 4444 XQ; export writes 422 HQ |
| AAC-LC | ✓ | ✓ | |
| VP8 | ✓ | Every coding tool, bitstream versions 0–3, hidden altref frames, alpha layer of transparent WebM; bit-exact with libvpx on its published VP8 test vectors; in WebM/Matroska and MP4 | |
| VP9 | ✓ | Profiles 0–3, 8/10/12-bit, 4:2:0 to 4:4:4, tiles and superframes; bit-exact on 50+ streams; in WebM/Matroska and MP4 | |
| Opus | ✓ | SILK, CELT, hybrid and multistream surround; range-exact on every RFC 8251 conformance vector; in WebM/Matroska and MP4 | |
| AV1 | ✓ | Main profile, 8/10-bit 4:2:0 and monochrome, every coding tool incl. film grain, superres and spatial layers; bit-exact with libdav1d on the libaom vectors tested; in MP4 and WebM/Matroska | |
| DNxHD / DNxHR | ✓ | ✓ | All SMPTE ST 2019-1 CIDs (LB to 444, 8/10/12-bit); export writes DNxHR in MOV |
| MJPEG, PCM | ✓ | ✓ | |
| MP3, FLAC, ALAC, Vorbis | ✓ | Via the symphonia crate (MPL-2.0) for now, to be replaced by our own | |
| MP4 / MOV | ✓ | ✓ | Fragmented MP4, edit lists, timecode tracks |
| Matroska / WebM | ✓ | Lacing, Cues, header stripping, HDR colour metadata | |
| AVI | ✓ | AVI 1.0 and OpenDML (files past 1 GB); Motion JPEG, H.264, HEVC and uncompressed RGB / YUV with PCM, MP3, MP2 or AC-3. DivX / Xvid and DV not yet | |
| Stills | ✓ | ✓ | Import PNG, JPEG, GIF, WebP, TIFF and BMP (animated GIF, APNG and WebP as clips, with transparency); export PNG sequences and animated GIF |
Also imported: MPEG-2 / MPEG-1 video, AC-3, MP2, MXF (OP1a / OP-Atom), MPEG transport and program streams (AVCHD, broadcast, DVD), Ogg and image sequences. Not yet: AV1 export, camera RAW, E-AC-3. Hardware decoding works on macOS (VideoToolbox), Windows (Media Foundation) and, for H.264 and HEVC, Linux (VA-API); H.264 export can use NVIDIA's encoder on Windows and Linux (opt-in), and H.265 (HEVC Main, 8-bit) export works through it (NVENC on Windows, VideoToolbox on macOS) (#30).
Export
- H.264 MP4 with AAC, using our own encoders. A 6-second 960×540 render takes 1.3 seconds and decodes in ffmpeg without a single warning, with strict error detection on.
- Also: Apple ProRes 422 HQ and Motion JPEG in QuickTime, MXF OP1a and standard OP-Atom (DNxHR, ProRes or H.264 with PCM and start timecode), PNG sequences, animated GIF and WAV.
- Background jobs with progress and cancel, so you keep editing while it renders.
- Render previews: the render bar marks segments green, yellow or red; rendered previews are cached by content, so an edit only invalidates what it touches and undo brings the green back.
Interchange
Move timelines between FilmCraft and every other editor:
- FCP 7 XML (xmeml): industry-standard timeline interchange format. It carries nested sequences, transitions, generators, Motion, Opacity, Time Remap and audio levels, with keyframes.
- FCPXML 1.9–1.11: the spine, connected clips as lanes, transitions, retiming and compound clips.
- OpenTimelineIO: the open interchange format of the film industry, round-tripping every FilmCraft detail through
metadata.filmcraft. - CMX 3600 EDL: the oldest format still in use, with drop-frame timecode, dissolves, wipes, speed changes (
M2) and one EDL per track. - AAF (Edit Protocol): standard timeline and audio interchange format. Video and audio tracks, dissolves and dips, clip volume with keyframes, markers and source timecode; audio embedded or as separate WAV / AIFF files, trimmed with handles, with clip effects rendered in and broken out to mono, plus an optional video mixdown. Import reads AAF back, extracting embedded audio.
- OMF 2.0: the audio-post handoff: the audio tracks with crossfades and gain, sample-accurate, with the audio encapsulated or alongside.
Import merges the document's bins, media and sequences into your project as one undoable step, and links each media file it finds on disk.
Built for agents
Every menu item, button, slider and drag in FilmCraft is a command with an id, typed parameters and an enabled state. There are more than 650 engine commands (filmcraft-cli commands lists them), with more commands continuously added. The UI, the CLI, a JSON control channel and an MCP server all dispatch the same commands, so Claude or any agent can cut, trim, grade, mix and export exactly the way a person does. The UI can also be driven at the level of mouse and keyboard: every widget has an automation id, and agents can click, drag, type and take screenshots.
// over the control channel (JSON lines on TCP) or as MCP tool calls
{"method": "engine.execute", "params": {"command": "timeline.place",
"params": {"item": 1, "track": "V1", "seconds": 0, "sourceIn": 284298240000000, "duration": 1270080000000}}}
{"method": "engine.execute", "params": {"command": "effects.setParam",
"params": {"clip": 87, "effect": "lumetri", "param": "curve_luma", "value": [[0,0],[0.25,0.21],[0.75,0.82],[1,1]]}}}
{"method": "ui.screenshot", "params": {"path": "frame.png"}}
The trailer and the grades in these screenshots were built exactly this way, by an agent driving the running app.
Everywhere
- Native on macOS, Windows and Linux, with a native macOS menu bar.
- The web: the same engine and UI run in the browser via WebAssembly (
apps/filmcraft-web, see docs/web.md); every release ships it asfilmcraft-web-<version>.zip. - Swappable UI. The interface is one crate (
ui-egui) over the engine, so a different front end can replace it without touching editing logic.
Get started
New to editing in FilmCraft? Follow Getting started: video fades and audio volume keyframes.
cargo run --release -p filmcraft # the desktop app, with a demo project
cargo run --release -p filmcraft -- --control 9876 # plus the JSON-lines control server
cargo run --release -p filmcraft-cli -- commands # list every engine command
cargo run --release -p filmcraft-cli -- mcp # MCP server (headless)
Japanese text in the interface and in titles comes from craft-fonts, an optional build input (release builds always include it; without it FilmCraft uses its own and the system's fonts):
git clone https://github.com/storytold/craft-fonts ../craft-fonts
CRAFT_FONTS_DIR="$PWD/../craft-fonts" cargo run --release -p filmcraft
The control protocol is documented in docs/control-protocol.md. Stuck, or want to show what you made? Ask in Discord.
Documentation
| CONTRIBUTING.md · docs/contributing.md | Setup, quality gates, commit conventions, how to add commands, effects, codecs, panels and assets |
| AGENTS.md | The rules every contributor must follow: assets, clean room, licences |
| docs/architecture.md | Layers, data model, time base, command system, render and export pipeline |
| docs/testing.md | Unit, property and ffmpeg-oracle tests, accuracy criteria, benchmarks |
| docs/agents.md | Driving FilmCraft over MCP and the control channel; how agents develop it |
| docs/control-protocol.md | Control-channel and MCP reference |
| docs/project-files.md | .fcproj format, schema migrations, auto-save and crash recovery |
| docs/graphics.md · docs/captions.md | Text engine, graphic clips and tools; caption tracks and formats |
| ROADMAP.md | Stage, parity numbers, languages, what's next and the progress log |
| docs/target-app-parity.md · docs/gaps.md · docs/roadmap.md | Parity assessment, the ranked list of shortfalls, milestones and current focus |
| docs/codec-parity.md · docs/file-format-parity.md · docs/hardware-parity.md · docs/ui-parity.md · docs/localization-parity.md | Parity checklists by dimension |
Status
FilmCraft is young and moving fast. Editing, trimming, multicam, colour, keyframes, effects, titles, captions, mixing, codecs and export work today.
FilmCraft is in alpha. We track two numbers (docs/target-app-parity.md, re-measured 2026-10-10):
- Feature breadth: ~86%. Professional NLE menu items, effects, transitions, panels and formats that exist in FilmCraft (menus 92% and effects 100% measured).
- Ready for real work: ~56%. Our honest estimate of how close FilmCraft is to handling full production work on real projects.
The biggest gaps today:
- Speed on big footage. Hardware decoding works on macOS and Windows, and for H.264 and HEVC on Linux (VA-API, or NVDEC with NVIDIA's driver; VP9 and AV1 decode in software there). Blend modes and the most common effects run on the GPU, but color grading, keys and export rendering still run on the CPU; H.264 encoding can use the hardware encoder on macOS and on Windows and Linux with an NVIDIA GPU (opt-in, Export ▸ Hardware encoding), and H.265 export is hardware-only on both (HDR sequences export Main 10 PQ / HLG with NVENC; VideoToolbox writes 8-bit SDR) (#30).
- Native
.prprojproject import..prprojfiles can't be opened yet; bring sequences over as FCP7 XML, AAF or OTIO. - No plugins. No VST3 / Audio Units or OpenFX hosting.
- Delivery codecs. H.264 is our only software delivery-codec export; H.265 exports only through a hardware encoder (NVIDIA on Windows: Main 8-bit SDR and Main 10 HDR PQ / HLG; VideoToolbox on macOS: 8-bit Main, SDR); no AV1 export yet.
- Real-world media and platforms. Our decoders are bit-exact on conformance streams, but camera and phone files in the wild are less tested. Windows and Linux get far less testing than macOS.
- AI features. Few so far; speech to text is optional and off by default.
Bug reports with real footage are the most useful thing you can send us: open an issue or tell us in Discord.
Architecture
A layered Cargo workspace:
| Layer | Crates |
|---|---|
| Codecs and containers | h264, h264enc, hevc, vp9, prores, aac, opus, isobmff, matroska, avi, bitstream |
| Foundations | time, geom, color, frame, media, text, project, audio-dsp |
| Editing and interchange | edit, codecs, captions, format (project files), interchange |
| Rendering and output | render, gpu, export |
| Engine | engine: command registry, session, undo, jobs |
| Front ends | ui-egui, automation (MCP), apps/filmcraft, apps/filmcraft-cli |
| Test support | testkit (ffmpeg oracles, fixtures), golden (golden-image tests) |
Nothing below the front ends depends on a UI toolkit or OS API. cargo xtask ci checks formatting, lints, tests, the layering rules, asset attribution and the wasm build.
Downloads
New to FilmCraft? Download it from the FilmCraft page on getartcraft.com. That's the easiest way to install it.
Want a specific build or format? On GitHub, the latest release has every build listed below, and all releases has earlier versions and their notes. <ver> in the file names is the version number, and SHA256SUMS.txt lists a checksum for every file.
Windows
| Build | Installer | Portable |
|---|---|---|
| x64 (64-bit Intel/AMD) | filmcraft-<ver>-windows-x64.msi | filmcraft-<ver>-windows-x64-portable.zip |
| arm64 (Snapdragon and other ARM PCs) | filmcraft-<ver>-windows-arm64.msi | filmcraft-<ver>-windows-arm64-portable.zip |
| x86 (32-bit) | filmcraft-<ver>-windows-x86.msi | filmcraft-<ver>-windows-x86-portable.zip |
Installers and executables are code-signed.
If the app doesn't open on Windows: the desktop app initializes only Vulkan and DirectX 12 by
default, not OpenGL. Letting wgpu also create an OpenGL instance can crash some graphics drivers (AMD's
atio6axx.dll) before the window appears, so the app would flash in Task Manager and quit.
WGPU_BACKEND overrides the default for troubleshooting (for example dx12 or vulkan). In
PowerShell, from the folder containing the executable:
$env:WGPU_BACKEND = "vulkan"
& .\filmcraft.exe
Remove-Item Env:WGPU_BACKEND # restore the default for later launches
An explicit gl override can bring the driver crash back on affected systems. The macOS, Linux
and web backend defaults are unchanged.
A PC whose GPUs were installed from different driver packages of one vendor (a laptop with an
integrated and a discrete AMD GPU, for example) can list one GPU twice, once through each installed
version of the Vulkan driver, and a window drawn through the stale one crashes inside the driver
(amdvlk64.dll, exit code 0xc0000005). FilmCraft draws with the newer one and says so in
%APPDATA%\FilmCraft\Logs\filmcraft.log; installing one driver package for every GPU removes the
duplicate. With one driver per GPU the adapter is the one wgpu picks, as before.
macOS
| Build | File | Notes |
|---|---|---|
| App, universal (Apple silicon + Intel) | filmcraft-<ver>-macos-universal.dmg | Signed and notarized |
| Command-line tool, universal | filmcraft-cli-<ver>-macos-universal.zip | Signed and notarized |
Linux
| Format | x86_64 | aarch64 (ARM64) | Notes |
|---|---|---|---|
| AppImage | filmcraft-<ver>-linux-x86_64.AppImage | filmcraft-<ver>-linux-aarch64.AppImage | Runs anywhere; updates itself with AppImageUpdate (.zsync files) |
| Flatpak | filmcraft-<ver>-linux-x86_64.flatpak | filmcraft-<ver>-linux-aarch64.flatpak | Sandboxed; flatpak install --user <file> |
| Debian/Ubuntu | filmcraft-<ver>-linux-x86_64.deb | filmcraft-<ver>-linux-aarch64.deb | |
| Fedora/RHEL/openSUSE | filmcraft-<ver>-linux-x86_64.rpm | filmcraft-<ver>-linux-aarch64.rpm | |
| Tarball | filmcraft-<ver>-linux-x86_64.tar.gz | filmcraft-<ver>-linux-aarch64.tar.gz | Unpack and run ./install.sh |
RISC-V (riscv64): filmcraft-<ver>-linux-riscv64.tar.gz (tarball only; needs glibc 2.39+, e.g. Ubuntu 24.04
or Debian 13).
The tarball installer places FilmCraft, its command-line tool and desktop integration in
~/.local, without administrator permissions. For all users, run
sudo ./install.sh --prefix /usr/local instead. Running the installer again updates the installation.
Gentoo (community-maintained): the ::snakebyte overlay
packages the Linux release as media-video/filmcraft-bin. It is maintained by the community, not by the
FilmCraft team, so report packaging problems to the overlay:
eselect repository add snakebyte git https://github.com/switch87/snakebyte-overlay.git
emaint sync -r snakebyte
echo 'media-video/filmcraft-bin ~amd64' >> /etc/portage/package.accept_keywords/filmcraft
emerge --ask media-video/filmcraft-bin
FreeBSD
| Build | File |
|---|---|
| x86_64 | filmcraft-<ver>-freebsd-x86_64.tar.gz |
Web (WebAssembly)
| Build | File | Notes |
|---|---|---|
| Static site | filmcraft-web-<ver>.zip | Runs in a modern browser; host it on any static server |
The Crafting Apps
FilmCraft is one of the Crafting Apps: free, open-source creative tools from the ArtCraft team, each written from scratch in Rust and each able to stand on its own.
| App | What it's for | Code | Learn more | |
|---|---|---|---|---|
| PhotoCraft | Image editing: layers, masks, type and real PSD files | GitHub | Website | |
| VectorCraft | Vector illustration | GitHub | Website | |
| FilmCraft | Video editing, color and sound | GitHub | Website | |
| LightCraft | Photo library and raw development | GitHub | Website | |
| PdfCraft | Reading, organizing and protecting PDFs | GitHub | Website | |
| EffectCraft | Motion graphics and visual effects | GitHub | Website | |
| DesignCraft | Page layout and publishing | GitHub | Website | |
| FigCraft | Interface design and prototyping | GitHub | Website | |
| WordCraft | Word processing and documents | GitHub | Website | |
| SoundCraft | Audio recording and editing | GitHub | Website | |
| DeckCraft | Presentations and slide decks | GitHub | Website | |
| CADCraft | Computer-aided design | GitHub | Website | |
| GridCraft | Spreadsheets and data | GitHub | Website | |
| TextureCraft | 3D texture painting | GitHub | Website | |
| Craft Anything | See how any software works, then build your own | GitHub | Website | |
| SolidCraft | Parametric 3D CAD by Tangency Labs (community app) | GitHub |
And ArtCraft itself, our AI image and video studio for artists who want real control.
License and credits
FilmCraft is dual-licensed under MIT or Apache-2.0, at your option. Copyright (c) 2026 ArtCraft Team and the FilmCraft contributors. Required notices are in NOTICE.
Bundled fonts, icons, images and other assets keep their own open licenses; each one is listed with its author, source and license in ATTRIBUTION.md. Builds made with craft-fonts (all official releases) also embed its fonts (OFL-1.1), listed in its ATTRIBUTION.md.
Footage and music in the screenshots: NASA's Apollo 11 film and television footage from images.nasa.gov (launch, Launch Control Center, lunar surface and recovery) and the Apollo 11 air-to-ground voice transcript, all US Government works in the public domain (NASA does not endorse this project); Night of the Living Dead (1968), Carnival of Souls (1962) and Charade (1963), all in the US public domain; Earth Views from the ISS by NASA; Chopin's Nocturne Op. 48 No. 1 and Ballade No. 1, performed for Musopen and released under CC0. The media itself is not in this repository. Sources and details for every asset are in ATTRIBUTION.md.
FilmCraft is an independent implementation. It contains no proprietary code, icons, images, presets or LUTs, and no GPL or LGPL code; every icon is drawn in code and every asset is openly licensed and attributed (AGENTS.md), apart from the ArtCraft name and logos, which are trademarks of the ArtCraft Team used under docs/brand/LICENSE-brand.txt. ffmpeg is used only as an external test oracle.
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the
ArtCraft Team and are not covered by this license. They may be used only unmodified, and only as
part of this repository and FilmCraft, under docs/brand/LICENSE-brand.txt.
Forks and modified versions must remove them.