mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-30 13:08:07 -06:00
Merge main into #2300; Cineon conversion kept in footage_frame_raw (main routes proxies through footage_frame), frame-blend cache key hashes both premul colour and Cineon settings, spec strings combined
This commit is contained in:
+30
-8
@@ -101,7 +101,7 @@ See [MCP conventions](mcp.md) for core tools, resources, strict arguments, and r
|
||||
|
||||
| Tool | What it does |
|
||||
|---|---|
|
||||
| `list_commands {filter?, enabled_only?, schemas?}` | Discover command ids, their param docs (and, with `schemas`, a JSON Schema each), and whether each can run now. |
|
||||
| `list_commands {filter?, enabled_only?, schemas?, compact?}` | Discover command ids, their param docs (and, with `schemas`, a JSON Schema each), and whether each can run now; `compact` lists only ids and labels (and overrides `schemas`). |
|
||||
| `describe_command {command \| id}` | One command in full: label, menu, shortcut, params doc, JSON `schema`, enabled / `why`. |
|
||||
| `execute_command {command \| id, params?}` | Run any command (undoable). Unknown parameter keys are rejected with the accepted list. |
|
||||
| `get_state` | Editor state (active comp, time, selections, tool) plus `app`: version, command and effect counts, export formats, parity summary. |
|
||||
@@ -111,7 +111,7 @@ See [MCP conventions](mcp.md) for core tools, resources, strict arguments, and r
|
||||
| `get_property {layer, path, comp?, time?}` | A leaf property's value at a time, keyframes and expression. Group paths (for example `geometryOptions`) contain children: inspect them with `get_layer`, then query a leaf such as `geometryOptions/extrusionDepth`. |
|
||||
| `set_property {layer, path, value?, time?, timeBase?, expression?, comp?}` | Sets a static value. With `time` it sets a keyframe (`timeBase: "comp"` for comp seconds); with `expression` it sets an expression. |
|
||||
| `add_keyframe {layer, path, time+value \| keys:[...], timeBase?, interpolation?, comp?}` | Adds keys (layer seconds, or comp seconds with `timeBase: "comp"`), then optionally applies linear/bezier/hold/easyEase. |
|
||||
| `list_effects {filter?}` | Effect ids, names, categories, GPU / 32-bpc support and parameters. |
|
||||
| `list_effects {filter?, compact?}` | Effect ids, names, categories, GPU / 32-bpc support and parameters; `compact` lists only ids, names and categories. |
|
||||
| `list_fonts {query?, variable?, rescan?}` | Font families text layers can use, bundled and installed, with their styles, origin, whether each is a variable font and own-language name; `variable` lists only variable fonts; `rescan` picks up fonts installed since launch. |
|
||||
| `add_effect {layer, effect, values?, comp?}` | Apply an effect and set its parameters in one call and one undo step (a failing value leaves nothing applied); returns the instance path (`effects/#n`) and its parameter paths. |
|
||||
| `render_frame {comp?, time?, max_side?, path?, inline?, transparent?}` | Returns a PNG image of a frame; `transparent: true` keeps the alpha (as an RGB + Alpha render writes it) instead of compositing over the comp background. |
|
||||
@@ -272,10 +272,10 @@ build real projects through these interfaces; they are worked examples of everyt
|
||||
then `keys.velocity {"outSpeed":0,"outInfluence":33.33}`.
|
||||
* **Gradients**: `set_property {"path":"contents/gfill/colors","value":["#0080ff","#ffff00"]}` or
|
||||
`{"colors":[[0,"#0080ff"],[1,[1,1,0]]],"opacities":[[0,1],[1,0.5]]}`.
|
||||
* **Image sequences**: `file.import {"paths":["/r/shot_0001.png"]}` imports the file's whole
|
||||
numbered run as one item (several picked frames: that range; a folder: each run in it;
|
||||
`"sequence": false`: one still; dropped files, `"drag": true`, import as stills unless
|
||||
`"sequence": true`, as in After Effects; `"alphabetical": true`: Force Alphabetical Order, the files
|
||||
* **Image sequences**: `file.import {"paths":["/r/shot_0001.png"], "sequence": true}` imports the
|
||||
file's whole numbered run as one item (several picked frames: that range; a folder: each run in
|
||||
it, also without `sequence`). Without `"sequence": true` a picked or dropped numbered file imports
|
||||
as one still, as in After Effects; `"alphabetical": true`: Force Alphabetical Order, the files
|
||||
play one after another) at `frameRate` or 30 fps (Settings ▸ Import). Missing frames show
|
||||
colour bars, as in After Effects. `file.interpretFootage {"items":[id], "frameRate":12,
|
||||
"startTimecode":1001}` conforms them and sets Override Start (the item and layers that ran to its end get the new
|
||||
@@ -540,7 +540,7 @@ indices): character attributes
|
||||
3. `layer.setText {"range":[6,11], "size":40, "fill":"#ff5500"}` styles the selection (the
|
||||
Character panel does the same); with an empty range it sets the style the next typed text takes.
|
||||
4. `edit.copy`, `edit.paste`, `edit.pasteTextMatchFormatting` and `edit.pasteTextFormattingOnly`
|
||||
work on the selected text; `text.endEdit` commits (an empty Type-tool layer is removed).
|
||||
work on the selected text; `text.endEdit` commits (an empty Type-tool layer is kept, as After Effects does).
|
||||
|
||||
Fonts: `text.fonts` (MCP `list_fonts`) lists every family a text layer can use, bundled and installed, with its
|
||||
styles, origin (`bundled`, `system`, `user`), `variable` (it has variation axes) and own-language name
|
||||
@@ -614,12 +614,21 @@ Extension points and the bundled extensions: [plugins.md](plugins.md).
|
||||
Display Style between Timecode and Frames: `file.projectSettings {"timeDisplay": "frames"}`.
|
||||
* `prop.pickWhip {layer, prop, target: {layer, prop, dimension?}}` links a property as its
|
||||
expression pick whip does; `dimension` picks one of the target's values (`position[0]`), as a
|
||||
drop on that value field does.
|
||||
drop on that value field does. `byIndex: true` (an Alt pick whip: Alt held as it drops) refers
|
||||
to an effect's properties by their index, `effect("Color Control")(1)`: it still reads a
|
||||
renamed property, but another one if properties are reordered.
|
||||
* Every property row has a property pick whip in the Parent & Link column
|
||||
(`timeline.prop.<uid>.propertyPickWhip`; the expression row's is `timeline.prop.<uid>.pickWhip`).
|
||||
Dragged onto another property's name or value, in the Timeline or Effect Controls
|
||||
(`effectControls.prop.<uid>.value[.<d>]`), it runs `prop.pickWhip`: the reference replaces the
|
||||
property's expression, or is added as one, and the expression is enabled.
|
||||
* Parent and Track Matte for several layers: on a selected layer's row, the Timeline's Parent
|
||||
menu and pick whip (`timeline.layer.<id>.parent`, `timeline.layer.<id>.pickWhip`) and its Track
|
||||
Matte menu and pick whip (`timeline.layer.<id>.trackMatte`,
|
||||
`timeline.layer.<id>.trackMattePickWhip`) set every selected layer's (on an unselected row,
|
||||
that layer's), in one undo step. Directly: `layer.setParent {layers, parent}` and
|
||||
`layer.setTrackMatte {layers, matte, kind}`, where `kind: "preserve"` keeps each layer's
|
||||
own matte mode.
|
||||
* A property's menu (right-click its name; entries `timeline.prop.<uid>.menu.<entry>`): Reset
|
||||
(`prop.reset`: no expression, and the property's default value, an effect parameter's or a
|
||||
Transform property's; an animated property keeps its keyframes and gets the default as a
|
||||
@@ -680,6 +689,19 @@ effectcraft-cli exec file.importLottie '{"path":"anim.json"}' main.ecproj --save
|
||||
effectcraft-cli render main.ecproj --comp Main --out main.mov --format prores --progress # progress lines on stderr for a program that reads them
|
||||
```
|
||||
|
||||
A long `run` doesn't fit on a command line (Windows caps it at 32 767 characters, Linux one
|
||||
argument at 128 KiB). `run --args-file F` reads the same `<id> <json>` arguments one per line;
|
||||
`run --commands FILE` reads steps as a JSON array of `{"command": ID, "params": {…}}` objects, or one
|
||||
such object per line (JSON Lines), and `--commands -` reads them from standard input. `--commands`
|
||||
may be repeated; its steps run after the positional pairs and `--args-file`. A malformed step is a
|
||||
usage error naming its index (from 0, as in the results) before anything runs, and the error of a step
|
||||
that fails ends with `(step N)`:
|
||||
|
||||
```sh
|
||||
effectcraft-cli run --commands steps.json --empty --save-as main.ecproj
|
||||
generate-steps | effectcraft-cli run main.ecproj --commands - --save --json
|
||||
```
|
||||
|
||||
Scripts written against After Effects' documented scripting API run with `script`:
|
||||
|
||||
```sh
|
||||
|
||||
+20
-5
@@ -37,7 +37,7 @@ cpal or muda. Everything in L0 to L4, the egui UI and the web app also build for
|
||||
| L3 | `render` | Evaluation and compositing: sources, masks, effects, transforms, 3D, motion blur, mattes, blending, layer cache, audio mixdown |
|
||||
| L3 | `media` | Footage decoding (FilmCraft's pure-Rust codecs), image sequences, Photoshop and SVG stills, frame cache |
|
||||
| L3 | `expr` | The expression engine (JavaScript via boa) with the After Effects object model |
|
||||
| L3 | `export` | Render queue encoding: H.264, HEVC and AV1 MP4, ProRes, WebM (VP9 + alpha or AV1, Opus), PNG/JPEG/TIFF/EXR sequences, GIF, WAV/AIFF |
|
||||
| L3 | `export` | Render queue encoding: H.264, HEVC and AV1 MP4, ProRes, WebM (VP9 + alpha or AV1, Opus), PNG/JPEG/TIFF/EXR/Targa sequences, GIF, WAV/AIFF |
|
||||
| L3 | `gpu` | The GPU compositor and GPU effects on wgpu compute shaders (Metal, Vulkan, Direct3D 12, WebGPU), checked against the CPU renderer |
|
||||
| L3 | `interchange` | Premiere Pro interop through timeline interchange (FCP7 XML, FCPXML, OTIO, EDL, AAF, OMF via FilmCraft's `filmcraft-interchange`): sequences ↔ compositions (§6a) |
|
||||
| L3 | `lottie` | Lottie JSON / dotLottie import and export (layers, precomps, eased and spatial keyframes, shapes, masks, mattes) with a warnings list for what Lottie cannot express |
|
||||
@@ -345,7 +345,10 @@ as NaNs (a kernel that skips pixels fails the oracle) and validation errors pani
|
||||
(`ui-egui::frames`); headless renders, the CLI (unless `--gpu`) and CI use the CPU. Outside
|
||||
tests, device errors are logged rather than fatal. A viewer frame that runs out of video memory
|
||||
(`Gpu::within_memory`) renders on the CPU, the uploaded layers and pooled textures are freed, and
|
||||
the RAM preview keeps half as many GPU frames from then on. A frame whose render panics is
|
||||
the RAM preview keeps half as many GPU frames from then on. The same guard catches a frame's
|
||||
validation errors (an invalid texture, often left by a failed allocation): that frame renders on
|
||||
the CPU and the kept textures are freed, but the compositor stays on and, with no allocation
|
||||
failure before it, the RAM preview keeps its GPU frames (#1319). A frame whose render panics is
|
||||
rendered again on the CPU or released, never left in progress. Native readbacks and timing waits
|
||||
share a finite deadline; failure retires pending readbacks exactly once, and late results are
|
||||
discarded. The desktop executable and browser page own their shared device's error/loss handlers and forward
|
||||
@@ -368,6 +371,13 @@ Playground cannons without interacting forces evolve every particle independentl
|
||||
backend (reached through `EffectHost::particles` when the GPU compositor is active) simulates one
|
||||
particle per invocation from the CPU's birth schedule and keeps per-key state checkpoints on the
|
||||
GPU, like `SimCache`; the CPU simulation stays the oracle (tests compare ids and positions).
|
||||
CC Particle World, CC Particle Systems II and CC Mr. Mercury sample their Birth Rate at every
|
||||
step (`EffectHost::param_at`, #1373), so a keyed rate only decides the births of its own time;
|
||||
the rate is left out of the simulation key, and a checkpoint is resumed only with the same rate history (the CPU state's `hist`, the GPU
|
||||
checkpoint's births). The rate's keyframes are read at the step's exact layer time
|
||||
(`EvalCtx::value_at_layer_time`; mapping it to comp time and back rounds under a fractional
|
||||
stretch), a rate without keyframes or an expression isn't sampled, and a layer of one of them with
|
||||
expressions isn't layer cached (its key can't see what an expression returned at earlier times).
|
||||
`effectcraft-cli bench --gpu` reports CPU vs GPU ms/frame, speed-up, Auto's ms/frame, pixel
|
||||
agreement and the steady-state upload / readback MB per frame for every comp plus an
|
||||
adjustment-layer comp.
|
||||
@@ -391,7 +401,10 @@ hierarchical block-matching optical flow and a bidirectional warp (Pixel Motion,
|
||||
its nested layers straight into the parent with concatenated transforms (one resample), so
|
||||
nested blend modes and adjustment layers act on the parent's layers; nested 3D layers use the
|
||||
parent's camera and lights and, when the precomp layer is 3D, are depth-sorted with the parent's
|
||||
3D run. Masks, effects or styles force a flattened render. Text layers are always rasterised at
|
||||
3D run. Essential Properties overrides (properties, Font and Media Replacement) travel with the
|
||||
collapsed context and are applied while the nested layers are evaluated, so they do not force a
|
||||
flattened render or clip at the precomp's frame. Masks, effects or styles force a flattened
|
||||
render. Text layers are always rasterised at
|
||||
their on-screen scale, as text is vector in After Effects; on shape layers and vector footage the
|
||||
switch is Continuously Rasterize and does the same. Quality: Draft samples
|
||||
nearest-neighbour, Wireframe draws the layer bounds. Slip edit (`layer.slip`, Alt+PageUp/Down,
|
||||
@@ -458,8 +471,10 @@ effects crate, hence the `effects → track` edge.
|
||||
`essential` field lists its exposed controls (properties, Media Replacement, groups, comments).
|
||||
Every precomp layer of such a comp gets an Essential Properties group (`GroupKind::Essential`,
|
||||
children `eg<control id>`), kept in step by `Session::edit`; editing a child overrides it for
|
||||
that instance. The renderer draws an instance with overrides from a copy of the project with the
|
||||
overridden source properties set (`essential::with_overrides`). Templates are `.ectemplate`
|
||||
that instance. A collapsed instance carries its property, Font and Media Replacement overrides
|
||||
into the nested render context (`Collapsed`, `EvalCtx::{property_overrides, media_overrides}`);
|
||||
other instances are drawn from a copy of the project with the overridden source properties set
|
||||
(`essential::with_overrides`). Templates are `.ectemplate`
|
||||
ZIPs: `manifest.json` (controls), `project.ecproj` (the comp and its dependencies), `media/…` and
|
||||
`poster.png`; importing offsets every id past the project's (`essential::offset_ids`).
|
||||
**Responsive Design — Time**: a time-stretched precomp maps time piecewise so its protected
|
||||
|
||||
@@ -103,7 +103,7 @@ Points are logical window coordinates. A target is `{id}` (the element's centre;
|
||||
| `ui.click` | `{id \| x,y, button?: left\|right\|middle, count?, modifiers?}` |
|
||||
| `ui.move` | `{id \| x,y}` |
|
||||
| `ui.drag` | `{from: target, to: target, steps? (12), modifiers?}`: press, move, release |
|
||||
| `ui.scroll` | `{id \| x,y, dx, dy}` |
|
||||
| `ui.scroll` | `{id \| x,y, dx?, dy?, unit?: point\|line, source?: wheel\|trackpad, pinch?, modifiers?}`: `line` is a mouse wheel (zooms the viewers); `point` (default) is a pixel-precise scroll; `source: trackpad` pans the viewers (as on macOS); with no `source` the viewers take a scroll in points as a wheel until one moves on both axes (a trackpad: from then on it pans); `pinch` is a trackpad pinch's zoom factor |
|
||||
| `ui.key` | `{key}`, for example `Space`, `F9`, `Cmd+Z`, `Cmd+Shift+Z`, `PageDown`, `Escape` |
|
||||
| `ui.type` | `{text}`: text input into the focused field |
|
||||
|
||||
@@ -210,7 +210,9 @@ takes a name, or as `{"Viewer":42}` and `{"ScriptPanel":77}` for viewers and Scr
|
||||
`move {target, zone?, before?}`, `setStackOpen {open}`, `resizeStack {height}`,
|
||||
`resizeSplit {path, size}`; `rect` is `[x, y, width, height]`). It returns
|
||||
`{"docking": workspace}`. `ui.dock.reset` returns the current workspace to its saved or
|
||||
built-in layout and returns the same.
|
||||
built-in layout and returns the same. Raw `Open` and `OpenAt` actions are refused in both
|
||||
`ui.dock {action}` and `window.panel.layout {action}`, as in `window.dockAction`; use the
|
||||
panel open commands instead.
|
||||
- `window.dockPanel {panel, anchor?, zone?, before?}` docks as `window.panel.dock`: `zone` is
|
||||
`center`, `tab`, `left`, `right`, `top`, `bottom`, `above` or `below`; without an anchor a
|
||||
side zone docks along that edge of the whole workspace. `window.floatPanel {panel, rect?}`
|
||||
|
||||
@@ -16,7 +16,7 @@ After Effects', and does the preset library exist. The per-effect catalogue is t
|
||||
| On the GPU | **280** (92%) | Measured: registry flags; GPU vs CPU agreement tested per effect |
|
||||
| 32-bit float, no clamping | 306 | Measured: registry flags |
|
||||
| **Rendered output matches After Effects** | **partly measured** | Some colour effects are checked against After Effects 2026 renders of our own test projects: Tint, Tritone, Black & White, Exposure, Levels, Curves, Luma Key, Extract, 4-Color Gradient and Fill within 1–3/255, Brightness & Contrast up to 6.2/255 (Color Correction, Generate and Keying rows below); Radial Blur, Glow, Venetian Blinds, Radial Wipe, Fractal / Turbulent Noise and Transform are checked the same way (rows below); every other effect is unmeasured. `effectcraft_effects::fidelity::compare_frames` exists for the corpus ([fidelity/README.md](fidelity/README.md)); simulation effects are pinned by golden hashes of our own output (M13.27) |
|
||||
| Animation presets | **54** original presets (8 text-animator, 23 Transitions, 23 Backgrounds) against After Effects' **621** `.ffx` presets | Measured: `crates/engine/presets/text_animators.json`, `crates/engine/presets/transitions.json`, `crates/engine/presets/backgrounds.json`; the After Effects `Presets` folder |
|
||||
| Animation presets | **76** original presets (8 text-animator, 23 Transitions, 23 Backgrounds, 22 Behaviors) against After Effects' **621** `.ffx` presets | Measured: `crates/engine/presets/text_animators.json`, `crates/engine/presets/transitions.json`, `crates/engine/presets/backgrounds.json`, `crates/engine/presets/behaviors.json`; the After Effects `Presets` folder |
|
||||
| 26.x additions | Curl Noise (26.3) present (#463 open); effect colour labels (26.5) present in Effect Controls only, not in the Timeline; the rebuilt Effect Controls (26.5) missing | Release notes |
|
||||
|
||||
**Breadth ≈ 85%** (presets weigh in; the effects themselves are ≈ 100%). **Ready ≈ 40%**: until a
|
||||
@@ -56,7 +56,7 @@ implemented under a generic name ("Key Light").
|
||||
**≈ 70–130 h**: a fidelity corpus case per effect at default and one non-default setting, compared
|
||||
with After Effects renders, and the fixes they turn up (40–80 h, most of it parallel, but every
|
||||
reference render needs After Effects on the owner's Mac); an original preset library covering
|
||||
After Effects' preset categories (Behaviors, Shapes, Synthetics, Text, Image effects remain; Backgrounds and
|
||||
After Effects' preset categories (Shapes, Synthetics, Text, Image effects remain; Backgrounds, Behaviors and
|
||||
Transitions exist) 15–35 h; the open effect bugs 10–20 h. Moving Fractal and the analysis effects to
|
||||
the GPU is performance, not parity.
|
||||
|
||||
|
||||
+4
-3
@@ -3,11 +3,11 @@
|
||||
<!-- Generated from the effect registry (crates/effects/src/catalog.rs); do not edit by hand.
|
||||
Regenerate: UPDATE_DOCS=1 cargo test -p effectcraft-effects --lib effects_doc_is_current -->
|
||||
|
||||
EffectCraft ships 307 effects with 3032 parameters in total, grouped into the same categories as the Effects & Presets panel. Every effect is our own implementation, written from public behaviour descriptions and standard image-processing literature. Parameter names, order, popup options, units, defaults and ranges follow the reference application so that projects, expressions and muscle memory carry over.
|
||||
EffectCraft ships 308 effects with 3033 parameters in total, grouped into the same categories as the Effects & Presets panel. Every effect is our own implementation, written from public behaviour descriptions and standard image-processing literature. Parameter names, order, popup options, units, defaults and ranges follow the reference application so that projects, expressions and muscle memory carry over.
|
||||
|
||||
- **GPU**: 280 effects also run on the GPU compositor with identical results.
|
||||
- **32**: 307 effects process 32-bit float (HDR, overbright) pixels without clamping.
|
||||
- **Status**: 307 implemented in full, 0 partial (what is missing is listed).
|
||||
- **32**: 308 effects process 32-bit float (HDR, overbright) pixels without clamping.
|
||||
- **Status**: 308 implemented in full, 0 partial (what is missing is listed).
|
||||
|
||||
Effects are addressed by id (`ec.<category>.<name>`) or display name in commands, scripts and the control channel, and every parameter by its id (`effects/#1/blurriness`).
|
||||
|
||||
@@ -16,6 +16,7 @@ Effects are addressed by id (`ec.<category>.<name>`) or display name in commands
|
||||
| Effect | Id | Params | GPU | 32 | Status |
|
||||
|---|---|---:|:-:|:-:|---|
|
||||
| 3D Channel Extract | `ec.3d.channelextract` | 6 | GPU | 32 | Implemented |
|
||||
| 3D Layer Instance | `ec.3d.instance3d` | 1 | | 32 | Implemented |
|
||||
| Cryptomatte | `ec.3d.cryptomatte` | 4 | GPU | 32 | Implemented |
|
||||
| Depth Matte | `ec.3d.depthmatte` | 3 | GPU | 32 | Implemented |
|
||||
| Depth of Field | `ec.3d.depthoffield` | 4 | GPU | 32 | Implemented |
|
||||
|
||||
@@ -71,6 +71,55 @@ After the fix, all ten tangents equal AE's to the printed 0.001 px, and the two
|
||||
test `spatial_auto_bezier_tangents_follow_after_effects` checks the rule on other original keys,
|
||||
including a timing change. AE's output stays local; only the script and these scores are tracked.
|
||||
|
||||
## Justify All with the every-line composer
|
||||
|
||||
Measured on 19 October 2026 with After Effects 2026 (26.2) on box text (EXPORTER read-back t6):
|
||||
with Justify All, AE stretches the paragraph's last line too and breaks the lines so that it is not
|
||||
a lone word (4 / 4 / 4 words where the other justifications break 6 / 6 / 1). EffectCraft's
|
||||
every-line composer ignored the last line's slack and left "twelve" alone on a stretched line; it now
|
||||
counts that slack for Justify All, and every word starts within 1 px of AE's. Regression test:
|
||||
`justify_all_balances_the_lines_with_the_every_line_composer`.
|
||||
|
||||
## Right-to-left point text with a justified paragraph
|
||||
|
||||
Measured on 19 October 2026 with After Effects 2026 (26.2) (EXPORTER read-back t7): right-to-left
|
||||
point text whose paragraph has a justified code (justify last left / centre / right, justify all)
|
||||
sits flush right at its anchor, like right-aligned text. EffectCraft placed it by the last-line
|
||||
side (left / centre / left). Now flush right; left-to-right point text is unchanged (not measured).
|
||||
Regression test: `rtl_point_text_with_a_justified_paragraph_is_flush_at_its_start`. Still open:
|
||||
AE wraps right-to-left box text slightly wider (its word gaps are 1–2 px narrower than in
|
||||
left-to-right text with the same font), so a 300 px box fits a word more per line.
|
||||
|
||||
## Text animator tracking
|
||||
|
||||
Measured on 19 October 2026 with After Effects 2026 (26.2): a text animator's Tracking Amount is in
|
||||
pixels, not 1/1000 em like the Character panel's tracking (Amount 30 adds 30 px between neighbouring
|
||||
characters at 80 px and at 40 px, half before and half after each), and a Subtract range selector
|
||||
over characters the first selector leaves out keeps them at 0 instead of tracking them negatively.
|
||||
With both, the EXPORTER's t8 layer D (Tracking 30 on characters 2–4 by index, a Subtract selector
|
||||
over the last 20 %) puts every glyph where AE does (it ended 88 px short). The "Tracking In" text
|
||||
preset now animates 40 → 0 px (was 400 → 0 thousandths of an em). Lottie export is unchanged (not
|
||||
checked against a player). Regression tests: `animator_tracking_is_in_pixels_as_in_after_effects`,
|
||||
`modes_combine`.
|
||||
|
||||
## Per-character 3D rotation order
|
||||
|
||||
Measured on 19 October 2026 with After Effects 2026 (26.2) (case 931: "H" at 400 px, per-character
|
||||
3D, animator X / Y / Z Rotation 40 / 30 / 20): a character turns as a 3D layer does, Rx · Ry · Rz
|
||||
(Z first). EffectCraft composed Rz · Ry · Rx, so the glyph faced another way (23 of 5184 grid points
|
||||
off, max 255); now 3 at the anti-aliased edge (mean 0.015). Regression test:
|
||||
`per_character_rotation_turns_z_first_as_a_3d_layer`.
|
||||
|
||||
## Rectangle path start point
|
||||
|
||||
Measured on 19 October 2026 with After Effects 2026 (26.2) on 400 × 300 shape rectangles with Trim
|
||||
Paths: a plain rectangle starts at its top-right corner and runs clockwise (0–25 % covers the right
|
||||
edge and 50 px of the bottom); with Roundness 40 it starts where the top-right arc meets the right
|
||||
edge. Start 70 / End 30 draws 30–70 %. EffectCraft started at the top-left corner (and the rounded
|
||||
rectangle elsewhere), so trimmed rectangles drew the wrong segment (86 of 5184 grid points off,
|
||||
now 5 at stroke edges). `effectcraft_path::rect` now draws AE's order, which also gives Convert to
|
||||
Bezier AE's vertex order. Regression test: `rectangles_start_where_after_effects_starts_them`.
|
||||
|
||||
## Still unmeasured
|
||||
|
||||
Rendered frame comparisons now have a deterministic `effectcraft_effects::fidelity::compare_frames`
|
||||
|
||||
@@ -48,7 +48,7 @@ trips and renders, checked by tests, not against After Effects), **partial** (na
|
||||
| GIF | R/W | yes | yes (animated) | good |
|
||||
| BMP | R | yes | — | good |
|
||||
| WebP | — | yes (still; animated WebP as footage with its frames, timing and alpha, #762) | — | beyond After Effects |
|
||||
| Targa `.tga` | R/W | yes (still and sequence; alpha interpreted on import) | none | good for import (#745); no Targa output |
|
||||
| Targa `.tga` | R/W | yes (still and sequence; alpha interpreted on import) | yes (sequence; uncompressed 24-bit RGB or 32-bit RGB + Alpha, straight or premultiplied) | good: import (#745); output reads back through it unchanged; the alpha is not labelled in the file (no TGA 2.0 extension area), so it is interpreted on import |
|
||||
| DPX / Cineon `.dpx` `.cin` | R/W | yes (still and sequence; 8/10/12/16-bit luma, RGB, RGBA, both byte orders; log code values shown as stored, or converted by Interpret Footage ▸ Cineon Settings ▸ Logarithmic Conversion) | none | partial: import (#756) and Cineon Settings; no DPX output; common in film VFX |
|
||||
| Radiance `.hdr` | R/W | yes (still and sequence, 32-bit linear float like OpenEXR) | none | good for import (#745); no Radiance output |
|
||||
| SGI, PICT, ElectricImage, RLA/RPF images | R | none | none | Legacy; RPF camera data import exists (`keys.rpfCameraImport`) |
|
||||
@@ -96,19 +96,19 @@ trips and renders, checked by tests, not against After Effects), **partial** (na
|
||||
| Mocha shapes | R (Mocha AE) | own documented JSON | — | Mocha's format is not public |
|
||||
| Vanishing Point `.vpe` | R | none | — | no public specification; the menu entry explains why |
|
||||
|
||||
## Render queue outputs (`OutputFormat::ALL`, 13)
|
||||
## Render queue outputs (`OutputFormat::ALL`, 14)
|
||||
|
||||
H.264 MP4, HEVC MP4, AV1 MP4, ProRes MOV, uncompressed 8-bit RGB / RGB + Alpha MOV (`raw `, + PCM;
|
||||
#372), WebM (VP9 or AV1 + Opus), PNG / JPEG / TIFF / OpenEXR sequences, animated GIF, WAV, AIFF.
|
||||
#372), WebM (VP9 or AV1 + Opus), PNG / JPEG / TIFF / OpenEXR / Targa sequences, animated GIF, WAV, AIFF.
|
||||
Missing against After Effects + Media Encoder: 16-bpc uncompressed, AVI and lossless-compressed
|
||||
single-file video (Animation / PNG codecs), DPX / Targa / Photoshop sequences, MXF, DNxHR, hardware
|
||||
single-file video (Animation / PNG codecs), DPX / Photoshop sequences, MXF, DNxHR, hardware
|
||||
encoders ([hardware-parity.md](hardware-parity.md)), and rendering safely over an existing file
|
||||
(#325).
|
||||
|
||||
## Estimate
|
||||
|
||||
**≈ 130–230 h**: `.aep` / `.aepx` import 80–160 h (after the owner decision), wiring TGA / DPX /
|
||||
HDR / MXF / AVI / DNx import and DPX/TGA output 10–20 h, FBX animation and skinning, USD and Substance 20–40 h,
|
||||
HDR / MXF / AVI / DNx import and DPX output 10–20 h, FBX animation and skinning, USD and Substance 20–40 h,
|
||||
relinking 6–12 h, `.mogrt`-compatible templates 15–30 h (partly parallel with the rest).
|
||||
|
||||
## Revision history
|
||||
|
||||
+4
-3
@@ -134,9 +134,10 @@ including files overwritten at the same path and byte size.
|
||||
and 3D models are not sources, and a composition can't be nested in itself. Alt-dragging onto a
|
||||
layer is one layer at a time, as in After Effects.
|
||||
Agents: `layer.replaceSource {"item": id, "layers": [ids]}`.
|
||||
- **File ▸ Replace Footage ▸ File…** (Ctrl+H) points the item at another file. Pick a numbered
|
||||
file to replace it with that file's whole sequence (`file.replaceFootage {"path": …,
|
||||
"sequence": false}` for one frame).
|
||||
- **File ▸ Replace Footage ▸ File…** (Ctrl+H) points the item at another file. A still stays a
|
||||
still, and a sequence item keeps bringing the new numbered file's run; pass
|
||||
`sequence: true` to bring a numbered still's whole run (`file.replaceFootage {"path": …,
|
||||
"sequence": true}`), or `sequence: false` for one frame.
|
||||
- **Replace with Precomposition (used N times)**, right-clicking a footage item or solid in the
|
||||
Project panel, puts the item in a new composition of its size,
|
||||
pixel aspect and frame rate, in the same folder, and switches every layer in every composition
|
||||
|
||||
+13
-2
@@ -63,11 +63,11 @@ are grouped by area; the issue tracker has the rest.
|
||||
| 4 | **No CI gate on pull requests** | `.github/workflows` has release, packaging-lint, FreeBSD and Windows ARM64 jobs only; `cargo xtask ci` runs locally | Regressions reach main unseen; 49 community PRs landed in one batch (#598) | 4–8 h | G3 · this file |
|
||||
| 5 | **Playback and scrubbing feel** | #595 stutter on cached frames (partly addressed: nearest-first RAM preview prefetch, cache bars at 1/3 resolution), #304, #504 / #335 audio late or crackling, #586 puppet lag (maintainers asked for details); #329 slow scrubbing (#784) and #554 closed | Preview is where motion designers spend their day | 25–50 h | G5 · [hardware-parity.md](hardware-parity.md) |
|
||||
| 6 | **Linux and Windows interaction bugs** | Open: #488 rename arrows (hardening landed, reporter asked for details), #492 anchor drag, #268 file drops on Wayland (winit), #613 Direct3D 12 compositor. Now closed: #491, #493, #467, #320, #302, #596 | Many reports come from Linux; some Windows GPUs fail to start the compositor | 25–45 h | G2 · [ui-parity.md](ui-parity.md) |
|
||||
| 7 | **Animation presets: 54 against 621** | After Effects ships 621 `.ffx` presets (Behaviors, Backgrounds, Shapes, Synthetics, Text, Transitions…); we ship 54 original presets (8 text-animator; 23 Transitions: wipes, clock and fan reveals, blinds, dissolves, card flips, CC wipes, fades, #757; 23 Backgrounds: drifting gradients, fog, cloud and smoke, plasma and magma, cells, hexagons, scrolling grids and checks, pulse rings, bokeh, light sweep, #1096, driven by expressions so they keep moving, not seamless loops) and read only our `.ecpreset`. Missing: Behaviors, Shapes, Synthetics, Image and more Text | Presets are how many designers start; tutorials assume them | 15–35 h (original presets; `.ffx` reading is out of clean-room scope) | G8 · [effects-parity.md](effects-parity.md) |
|
||||
| 7 | **Animation presets: 76 against 621** | After Effects ships 621 `.ffx` presets (Behaviors, Backgrounds, Shapes, Synthetics, Text, Transitions…); we ship 76 original presets (8 text-animator; 23 Transitions: wipes, clock and fan reveals, blinds, dissolves, card flips, CC wipes, fades, #757; 23 Backgrounds: drifting gradients, fog, cloud and smoke, plasma and magma, cells, hexagons, scrolling grids and checks, pulse rings, bokeh, light sweep, #1096, driven by expressions so they keep moving, not seamless loops; 22 Behaviors: wiggle, shake, float, orbit, bounce, drift, pendulum, spin, pulse, heartbeat, blink, strobe, flicker on transform and opacity, #1510) and read only our `.ecpreset`. Missing: Shapes, Synthetics, Image and more Text | Presets are how many designers start; tutorials assume them | 15–35 h (original presets; `.ffx` reading is out of clean-room scope) | G8 · [effects-parity.md](effects-parity.md) |
|
||||
| 8 | **Mask and shape bugs** | Open: #1004 mask vertex multi-select, #999 auto-pan, #1042 / #1033 vertex nodes under the bounding box, #959 / #960 shape group toggles and operators. Now closed: #510, #513, #527, #509, #303, #553, #932 (Convert To Bezier Path on a shape layer's parametric path) | Masks are core compositing | 10–20 h | G2 · [target-app-parity.md](target-app-parity.md) |
|
||||
| 9 | **Effect behaviour bugs** | #580, #463 Curl Noise, #369 Motion Tile output size, #943 Turbulent Displace Evolution, #473 Cryptomatte selection (quoted names with commas fixed, 3b7f1ace; UI and GPU time open), #474 multi-layer EXR (decode shared, faffad3a; f16 storage and cache sizing open). Closed: #526, #514, #533–#536 | Each one breaks a look someone built | 10–20 h | G1/G2 · [effects-parity.md](effects-parity.md) |
|
||||
| 10 | **Colour pipeline differences** | #340 ProRes 4444 tagged bt709 but sRGB-encoded (open); ACES 2.0 / OCIO 2.5 configs (26.5) missing; now closed: #494 32-bpc blend modes, #495 and #750 Working Gamma 2.4, #546 / #547 viewer colour | Wrong colour in delivery is a client-visible failure | 15–30 h | G1 · [file-format-parity.md](file-format-parity.md) |
|
||||
| 11 | **Text rendering and layout** | Open: #453 CJK text in comps, #316 paragraph alignment inverted (maintainers' tests show Left/Right correct; asked for a project), #417 soft at Fit (mostly fixed by #444), #550 toolbar font options. Closed: #483, #583 | Text is in almost every motion graphic | 10–20 h | G2 · [ui-parity.md](ui-parity.md) |
|
||||
| 11 | **Text rendering and layout** | #453 CJK text in comps: the Han fallback now reaches the installed Chinese faces; open: #316 paragraph alignment inverted (maintainers' tests show Left/Right correct; asked for a project), #417 soft at Fit (mostly fixed by #444), #550 toolbar font options. Closed: #483, #583 | Text is in almost every motion graphic | 10–20 h | G2 · [ui-parity.md](ui-parity.md) |
|
||||
| 12 | **3D interaction and depth** | No 3D transform gizmos (#392, #347); camera aperture (#260); reflections (#261); extruded surface materials beyond Front / Bevel / Side / Back Color (fb5a5e9a; #315 closed); #307 reopened (the viewer's renderer button now shows and switches the renderer, #645); Z position (#489) closed | Advanced 3D is After Effects' growth area since 2023 | 20–35 h | G2 · [ui-parity.md](ui-parity.md) |
|
||||
| 13 | **3D model formats and materials** | After Effects 26 imports FBX, USD/USDZ, STL besides glTF and OBJ (`usd_plugins`), and Substance 3D materials with mesh displacement (26.0–26.2); we read glTF, OBJ, STL (binary and ASCII, with facet colours) and FBX 7.x (binary and ASCII: meshes, hierarchy, Lambert/Phong materials and textures; no FBX animation or skinning yet) | Product shots and 3D scenes come as FBX/USDZ | 25–45 h | — · [file-format-parity.md](file-format-parity.md) |
|
||||
| 14 | **Object Matte** (26.2, disk cache in 26.5) | First slice (#783): the Object Matte effect (Effect ▸ Matte) and `objectMatte.apply` turn a point (and optional box) on a reference frame into a matte and follow the object up to 600 frames each way, or segment every frame on its own; Roto Brush's engine, cache and model (MobileSAM from Settings ▸ Roto Brush, classical graph cut without it). Since then: the Object Matte tool in the viewer (click / drag a box, hover crosshair), the box as the model's box prompt, background tracking with progress and cancel, Freeze, and segmentations kept in the disk cache (26.5). Missing: a comparison with After Effects ([plan](fidelity/object-matte.md)) | The new one-click roto | 10–20 h | G7 · [target-app-parity.md](target-app-parity.md) |
|
||||
@@ -133,6 +133,12 @@ The most important missing piece: it turns every other estimate here into a meas
|
||||
the prompt, with their layers, in one undo step, for single items, multiple selections and
|
||||
folder contents. Nothing happens with an empty selection, in other panels, while typing or with
|
||||
a dialog open, and the next Delete still asks.
|
||||
- Regression evidence for [#947](https://github.com/storytold/effectcraft/issues/947): the
|
||||
preview startup tests in `ui_audio_scrub`, checked headlessly on Windows with a fake output
|
||||
device, start an audible preview on an uncached comp. The playhead holds the first frame until
|
||||
the frames ahead are cached, the sound starts at that frame (from 0 s and from 1 s, also for a
|
||||
30 s work area), and a tone lasting only the first 100 ms reaches the output. Video off still
|
||||
starts at once, no device plays the picture, and Stop while preparing leaves nothing playing.
|
||||
- Regression evidence for [#612](https://github.com/storytold/effectcraft/issues/612): the
|
||||
`ui_gradient_value` and `ui_gradient_editor` input tests, checked headlessly on Windows, open
|
||||
the Gradient Editor from the Timeline's "Edit Gradient…" on a shape layer's Gradient Fill. They
|
||||
@@ -163,6 +169,11 @@ The most important missing piece: it turns every other estimate here into a meas
|
||||
a Radial Stroke swatch on a selected shape layer and get the Gradient Editor on its Gradient Fill
|
||||
/ Gradient Stroke Colors (OK saves); without such a gradient the swatch still opens the options,
|
||||
and the words, Solid swatches and Alt-click are unchanged.
|
||||
- Regression evidence for [#1306](https://github.com/storytold/effectcraft/issues/1306) (from
|
||||
#1072): the `ui_expression_values` tests, checked headlessly on Windows, read the colour the
|
||||
values are painted in. Expression-driven vectors, angles and scalars are red in the Timeline,
|
||||
Effect Controls and Properties panel, in dark and light themes, hovered too; disabled, removed
|
||||
and empty expressions show the ordinary colour.
|
||||
- Regression evidence for the reports of 6 October, checked headlessly on Windows: real pointer
|
||||
drags in `ui_drag_drop` (Project items into the Timeline between layers and at a time, and onto
|
||||
the viewer; an effect onto a layer in the viewer: #85, #88, #89), `ui_render_queue` (a template
|
||||
|
||||
@@ -23,7 +23,7 @@ monitors are missing, and two GPU start-up failures are open.
|
||||
| HDR display | HDR monitoring on EDR / HDR displays | tone-mapped SDR view; no EDR output | no HDR output | no | no | Colour engine handles HDR maths (Rec. 2100 PQ/HLG output files) |
|
||||
| Pen tablets (pressure, tilt) | yes, for Paint and Roto | Brushes panel has pressure options, but no tablet pressure is read | same | same | same | Paint strokes store pressure per vertex; input never fills it |
|
||||
| Multiple monitors | panels and windows across screens | panels move into their own native windows on any screen (Move Panel to New Window; desktop builds) | same | same (#486) | — | gap 20 |
|
||||
| Touch / trackpad gestures | pinch zoom in viewers | egui pointer and scroll; no pinch-to-zoom audited | — | — | — | — |
|
||||
| Touch / trackpad gestures | pinch zoom in viewers | Composition and Layer viewers: two-finger scroll pans, pinch zooms around the pointer (Alt + scroll and the mouse wheel zoom too); Timeline pinch zooms time | two-finger scroll pans once it moves diagonally (a pixel-precise wheel keeps zooming); pinch arrives as Ctrl + scroll and zooms | same | same | No rotate or swipe gestures; tested in `ui_viewer_trackpad.rs` (UI logic, not on hardware) |
|
||||
| Audio hardware | Core Audio / ASIO / WASAPI, device choice, latency | cpal output; preview sound late after a start offset (#504 open; #554 closed) | cpal | cpal (ALSA) | Web Audio | No input or device latency settings |
|
||||
| Machine learning acceleration | Apple Neural Engine / GPU for Object Matte, Roto Brush 3 | CPU inference (pure Rust, rayon) | CPU | CPU | CPU | No GPU inference for MobileSAM or MediaPipe |
|
||||
| Memory management | RAM reserve, disk cache | RAM Reserved, Reduce Cache When Low on Memory, disk cache | same | same | OPFS disk cache | good |
|
||||
|
||||
+16
-14
@@ -22,10 +22,10 @@ interface; Arabic and Hebrew text *in layers* is supported through its Middle Ea
|
||||
or on a repeated row. The generated Effect menu is not part of that fixed tree: its entries
|
||||
and category submenus take their labels from the effect catalog below.
|
||||
- **Panels, dialogs, buttons, tooltips:** `crates/ui-egui/src/i18n/ui.rs`, keyed by the English
|
||||
source string, with English fallback. Catalogs exist for Japanese (410 rows), Simplified and
|
||||
Traditional Chinese (506 each), Ukrainian (505), Brazilian Portuguese (400) and Czech (501);
|
||||
counted at 470ea7a3. Georgian has every row the Chinese catalogs have at this revision (695, as
|
||||
both Chinese catalogs now have), plus 191 for panels converted to the catalog.
|
||||
source string, with English fallback. Catalogs exist for Japanese (693 rows), Simplified and
|
||||
Traditional Chinese (695 and 648 since #2244 pruned the Traditional one), Ukrainian (524),
|
||||
Brazilian Portuguese (695) and Czech (518), counted at this tree. Georgian has every row the
|
||||
Simplified Chinese catalog has, plus 191 for panels converted to the catalog.
|
||||
- **Effect names:** `crates/ui-egui/src/i18n/effects.rs`, keyed by **effect id**, in Simplified
|
||||
Chinese and Georgian (307 rows, one per effect in the registry, plus its 21 categories). The registry's
|
||||
English name stays the effect's identity: `effect.list`, `effect.apply {"effect": …}`, scripts
|
||||
@@ -71,14 +71,14 @@ the true percentages are slightly lower.
|
||||
| Language | Code | UI strings translated | Dialogs / tooltips / help | Script support | Native review | Status | To `full` |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| English | `en` | ≈ 3,900 (100%, source) | All; docs in English | — | yes | full | — |
|
||||
| Simplified Chinese | `zh-hans` | 1,130 (≈ 29%): menus 624 rows, panels 506 | Panels and dialogs partly; no help, effect names translated (306) and their parameter names not; Home screen literals unwrapped (#574, closed) | System CJK fallback; Han follows the UI language; CJK text in comps renders wrongly (#453); IME in text layers | no | partial | 6–9 h + review |
|
||||
| Spanish | `es` | 624 (≈ 16%) | Menus only (panel catalog in open PR #996) | Latin, fine | no | menus only | 7–10 h + review |
|
||||
| Simplified Chinese | `zh-hans` | 1,324 (≈ 34%): menus 629 rows, panels 695 | Panels and dialogs at the zh source list; no help, effect names translated (307) and their parameter names not; Home screen literals unwrapped (#574, closed) | System CJK fallback; Han follows the UI language; CJK text in comps renders wrongly (#453); IME in text layers | no | partial | 6–9 h + review |
|
||||
| Spanish | `es` | 1,142 (≈ 29%): menus 629 rows, panels 513 | Menus only; the panel catalog from #996 | Latin, fine | no | partial | 9–12 h + review |
|
||||
| Hindi | `hi` | 0 | — | UI: Devanagari fallback font but no shaping; text layers shape Devanagari | no | none (After Effects: none) | 9–13 h + shaping in the UI |
|
||||
| Arabic | `ar` | 0 | — | UI: Arabic fallback font but no shaping and no RTL layout; text layers: bidi + shaping | no | none (After Effects: none) | 9–13 h + 15–25 h RTL UI |
|
||||
| French | `fr` | 624 (≈ 16%) | Menus only | Latin, fine | no | menus only | 7–10 h + review |
|
||||
| Portuguese (Brazil) | `pt-br` | 1,024 (≈ 26%): menus 624 rows, panels 400 | Panels and dialogs partly | Latin, fine | no | partial | 6–9 h + review |
|
||||
| Portuguese (Brazil) | `pt-br` | 1,324 (≈ 34%): menus 629 rows, panels 695 | Panels and dialogs at the Chinese catalogs' source list; the six keys main added after that count are translated too; AI-assisted, not yet native-speaker proofread | Latin, fine | no | partial | independent native review |
|
||||
| Indonesian | `id` | 0 | — | Latin, fine | no | none (After Effects: none) | 8–12 h + review |
|
||||
| Japanese | `ja` | 1,034 (≈ 27%): menus 624 rows, panels 410 | Panels and dialogs partly | Japanese system fallback; vertical text and Tate-Chu-Yoko in text layers; IME | no | partial | 6–9 h + review |
|
||||
| Japanese | `ja` | 1,322 (≈ 34%): menus 629 rows, panels 693 | Panels and dialogs partly | Japanese system fallback; vertical text and Tate-Chu-Yoko in text layers; IME | no | partial | 6–9 h + review |
|
||||
| German | `de` | 624 (≈ 16%) | Menus only (open PR #666 adds interface translations) | Latin, fine | no | menus only | 7–10 h + review |
|
||||
| Korean | `ko` | 0 | — | Hangul fallback probe added (#599, closed); not checked on macOS here | no | none | 9–13 h + review |
|
||||
| Vietnamese | `vi` | 0 | — | Latin with stacked diacritics; untested | no | none (After Effects: none) | 8–12 h + review |
|
||||
@@ -87,16 +87,17 @@ Other languages EffectCraft ships (4):
|
||||
|
||||
| Language | Code | UI strings translated | Status | To `full` |
|
||||
|---|---|---|---|---|
|
||||
| Traditional Chinese | `zh-hant` | 1,130 (≈ 29%): menus 624 rows, panels 506 | partial | 6–9 h + review |
|
||||
| Ukrainian | `uk` | 1,129 (≈ 29%): menus 624 rows, panels 505 | partial | 6–9 h + review |
|
||||
| Czech | `cs` | 1,125 (≈ 29%): menus 624 rows, panels 501 | Existing catalog entries covered; unwrapped UI, effects and engine text still in English; AI-assisted, not yet native-speaker proofread | Remaining strings + independent native review |
|
||||
| Traditional Chinese | `zh-hant` | 1,277 (≈ 33%): menus 629 rows, panels 648 | partial | 6–9 h + review |
|
||||
| Ukrainian | `uk` | 1,153 (≈ 29%): menus 629 rows, panels 524 | partial | 6–9 h + review |
|
||||
| Czech | `cs` | 1,147 (≈ 29%): menus 629 rows, panels 518 | Existing catalog entries covered; unwrapped UI, effects and engine text still in English; AI-assisted, not yet native-speaker proofread | Remaining strings + independent native review |
|
||||
| Georgian | `ka` | 1,514 (≈ 39%): menus 628 rows, panels 886 (the Chinese catalogs' 695 plus 191 Georgian-only rows: form dialogs, context menus, column headers), effect names 307 + 21 categories; native-speaker reviewed | partial | 5–8 h |
|
||||
|
||||
Russian (`ru`) has a menu catalog (624 rows, ≈ 16%); After Effects also ships Italian, which EffectCraft does not (8–12 h).
|
||||
|
||||
**Overall: ≈ 18%**, the average coverage of After Effects' 10 non-English languages
|
||||
(Simplified and Traditional Chinese 29%, Japanese 27%, Brazilian Portuguese 26%, Spanish, French,
|
||||
German and Russian 16%, Korean and Italian 0%; 175 / 10, was ≈ 12% on 10 October). This is the localization row in
|
||||
**Overall: ≈ 21%**, the average coverage of After Effects' 10 non-English languages
|
||||
(Simplified Chinese, Traditional Chinese, Japanese and Brazilian Portuguese 34%, Spanish 29%,
|
||||
French, German and Russian 16%, Korean and Italian 0%; 212 / 10, was ≈ 12% on 10 October;
|
||||
Ukrainian (≈ 29%) and Czech (≈ 29%) are EffectCraft-only and stay out of that average). This is the localization row in
|
||||
[target-app-parity.md](target-app-parity.md#by-dimension).
|
||||
|
||||
**Effort.** One-time work first: route parameter names and engine messages through
|
||||
@@ -111,6 +112,7 @@ can give; only Georgian, contributed by a native speaker (#1843), has had it.
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-18 | minor | Brazilian Portuguese completes its panel catalog (278 new rows, 417 → 695, the Chinese catalogs' source list); the doc recount closes the drift the batch merges left in every language's panel count; AI-assisted, not yet native-speaker proofread |
|
||||
| 2026-10-12 | minor | Recounted: Russian, French, German and Czech menus (#873, #987), Brazilian Portuguese and Czech panels (#830, #987), Hangul probe (#599); overall ≈ 12% to ≈ 18%; Korean and Italian still absent |
|
||||
| 2026-10-14 | minor | Georgian (`ka`): menus 628, panels 886 (191 Georgian-only, in `GEORGIAN_PANELS`), effect names and categories in `effects.rs` |
|
||||
| 2026-10-10 | major | First localization parity document: catalog rows counted for all six languages, the twelve-language table, After Effects' 11 shipped languages from its bundle |
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ The server provides the same core conventions as FilmCraft #28:
|
||||
|
||||
| Tool | Arguments | Result |
|
||||
| --- | --- | --- |
|
||||
| `command_list` | `filter?`, `enabled_only?`, `schemas?` | Command catalog |
|
||||
| `command_list` | `filter?`, `enabled_only?`, `schemas?`, `compact?` | Command catalog |
|
||||
| `command_run` | `id`, `params?` | Engine command result |
|
||||
| `command_batch` | `steps: [{id, params?}]`, `stop_on_error?` | `completed`, `failed`, per-step `results` |
|
||||
| `doc_inspect` | none | Project overview and active composition |
|
||||
|
||||
+14
-2
@@ -12,12 +12,12 @@ Guide):
|
||||
| After Effects | EffectCraft | |
|
||||
|---|---|---|
|
||||
| Effect plug-ins (C/C++ SDK, `.aex` / `.plugin`) | [Effect plug-ins](#effect-plug-ins): WebAssembly modules (plug-in API v1) or Rust; the `Plug-ins` folder next to the settings loads at start-up | Different ABI: After Effects SDK plug-ins can't run (G8) |
|
||||
| Scripts folder: its scripts are listed in File ▸ Scripts | `Scripts/` in the settings folder (File ▸ Scripts ▸ Install Script File… copies a script there), listed in File ▸ Scripts with the bundled samples | Same |
|
||||
| Scripts folder: its scripts are listed in File ▸ Scripts | `Scripts/` in the settings folder (File ▸ Scripts ▸ Install Script File… copies a script there), listed in File ▸ Scripts with the bundled samples; a subfolder (one level) is a submenu named after it | Same |
|
||||
| File ▸ Scripts ▸ Run Script File… (`.jsx`, `.jsxbin`) | `.jsx` / `.js` | Gap: `.jsxbin` (an undocumented binary encoding) |
|
||||
| File ▸ Scripts ▸ Recent Script Files: the 10 most recently run scripts; Cmd+Option+Shift+D (Ctrl+Alt+Shift+D on Windows) reruns one | File ▸ Scripts ▸ Recent Script Files lists the 10 scripts run last (script files and File ▸ Scripts entries, newest first, kept in the settings); Cmd+Alt+Shift+D runs the most recent one again (`file.runScript {"recent": 0}`, a key that can be changed in Edit ▸ Keyboard Shortcuts) | Same |
|
||||
| ExtendScript preprocessor directives (`#include`, `#target`, `#targetengine`) | `#include` / `//@include` / `#includepath` inline files relative to the script (once each, depth-limited, file gate applies); `#target`, `#targetengine`, `#strict` are ignored | Same |
|
||||
| `Scripts/Startup` and `Scripts/Shutdown`: run in alphabetical order when the app starts and quits | Not run | Gap |
|
||||
| `Scripts/ScriptUI Panels`: listed at the bottom of the Window menu, dockable like the app's own panels, `this` is the panel | `Scripts/ScriptUI Panels/` in the settings folder (File ▸ Scripts ▸ Install ScriptUI Panel… copies one there), listed at the bottom of the Window menu, docked like any panel, `this` is the panel; the panels open when the app quits open again at the next launch | Same. Where a panel was docked isn't kept: workspace layouts aren't saved between launches |
|
||||
| `Scripts/ScriptUI Panels`: listed at the bottom of the Window menu, dockable like the app's own panels, `this` is the panel | `Scripts/ScriptUI Panels/` in the settings folder (File ▸ Scripts ▸ Install ScriptUI Panel… copies one there), listed at the bottom of the Window menu (a subfolder, one level, is a submenu named after it), docked like any panel, `this` is the panel; the panels open when the app quits open again at the next launch | Same. Where a panel was docked isn't kept: workspace layouts aren't saved between launches |
|
||||
| Keyboard shortcuts for scripts (the Keyboard Shortcuts editor lists the scripts of the Scripts folder) | Shortcuts bind to commands and menu entries; the File ▸ Scripts and Window menu entries of scripts aren't offered | Gap |
|
||||
| Running a script from the command line (`afterfx -r script.jsx`) | `effectcraft-cli script`, the control channel's and MCP's `script.run` | Same purpose, other entry points |
|
||||
| `app.settings` (kept in the preferences between sessions) | Kept in `script_settings.json` in the settings folder (`script.settings.get` / `script.settings.save`) | Same |
|
||||
@@ -41,6 +41,11 @@ journaled and the same as the UI's action. The `effectcraft-script` crate's docs
|
||||
folder). It is listed in File ▸ Scripts at once (After Effects asks for a restart).
|
||||
* `file.scripts.list` lists installed and bundled scripts and panels; `file.runScript {name}` runs
|
||||
one; `file.uninstallScript {name}` removes an installed one.
|
||||
* A subfolder of `Scripts/` is a submenu of File ▸ Scripts named after the folder, and its scripts
|
||||
are named `Folder/File.jsx` in `file.scripts.list` and `file.runScript`. One level of folders is
|
||||
listed; deeper folders are not. `file.uninstallScript` removes only scripts at the top of the
|
||||
Scripts folders: delete a script in a subfolder yourself. A subfolder may be a link to another
|
||||
folder (an extension's own), and uninstall never deletes a file through it.
|
||||
|
||||
## ScriptUI panels
|
||||
|
||||
@@ -52,6 +57,13 @@ other panel. Closing the tab closes the panel (its `onClose` runs). Panels open
|
||||
quits open again at the next launch (`window.restoreScriptPanels`, which the desktop and web apps
|
||||
run at start-up; the list is `scriptui_panels.json` in the settings folder).
|
||||
|
||||
To group panels, for example the several panels of one extension, make a subfolder of
|
||||
`Scripts/ScriptUI Panels/` and put them in it: `Scripts/ScriptUI Panels/My Tools/Animate.jsx` is
|
||||
listed as Window ▸ My Tools ▸ Animate.jsx, its tab is titled Animate, and commands name it
|
||||
`My Tools/Animate.jsx` (`window.scriptPanel {name}`). One level of folders is listed. Install
|
||||
ScriptUI Panel… copies a panel to the top of the folder; make the subfolder and move panels into it
|
||||
yourself, and delete them from it yourself too.
|
||||
|
||||
Run from File ▸ Scripts instead, the same script gets no panel, so it should make a floating
|
||||
palette itself. A minimal panel:
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ Commands (CLI, MCP, control channel):
|
||||
- `startup.windowGraphics`: Window Graphics (`auto` / `gl`), what the desktop window draws with from the next launch. `auto` lets the platform pick (DirectX 12, Vulkan or Metal); `gl` uses OpenGL, with CPU compositing, for graphics drivers that crash with the others. A launch leaves a `launch-pending` marker in the settings folder until its window has been drawing for a few seconds (or the app quits normally before that); a launch that stops earlier (a graphics driver crashing as the window opens or as its surface is re-created) leaves the marker behind, and the next launch switches to `gl` and says so (not on macOS, which has no OpenGL backend). `WGPU_BACKEND` overrides both.
|
||||
- `project.useTemplate`: New Project Loads Template
|
||||
- `project.templatePath`: Template Project
|
||||
- `project.compactProjectFiles`: Save Compact Project Files (default off). Off: File ▸ Save writes `.ecproj` files as indented JSON, one value per line, easy to read and diff in version control. On: compact JSON on one line, smaller and faster to save and open. Either opens the same; auto-saves, XML copies and template packages are not affected.
|
||||
- `autoSave.enabled`: Automatically Save Projects
|
||||
- `autoSave.intervalMinutes`: Save Every
|
||||
- `autoSave.maxVersions`: Maximum Project Versions
|
||||
|
||||
@@ -22,7 +22,7 @@ our own scripts; no real-world script library has been run against both apps.
|
||||
| `$.evalFile`, `BridgeTalk` | Evaluate another script file; identify the host application and message other Adobe applications | `$.evalFile` evaluates a file relative to the calling file (nested at most 32 deep, under the scripts' file gate) and returns its last value; `BridgeTalk` names the host honestly (`appName` `effectcraft`, its version); messaging other applications throws "not supported" | partial | `tests_evalfile.rs` (#760); no inter-application messaging |
|
||||
| ScriptUI | Dialogs, palettes, dockable panels, resource strings, `onDraw` / ScriptUIGraphics, mouse events | Same, dockable panels reopen at launch | good | `ui_scriptui`, `tests_ui*` |
|
||||
| `app.scheduleTask` / `cancelTask` | One-shot and repeating tasks (polling, panel refresh) until `cancelTask` | Same: repeating tasks run every `delay` ms (at least 50 ms, at most 64 pending per script) until `cancelTask`, until they throw (reported once, then cancelled), or until their owner goes: a script's last window closing, or the project closing for scripts without windows; frontends tick them every frame, agents with `script.runTasks` | good | `tests_tasks.rs` (#773); one-shot tasks of a script file still run right after it, not after their delay |
|
||||
| Scripts menu, ScriptUI Panels folder | yes | yes | same | [plugins.md](plugins.md) |
|
||||
| Scripts menu, ScriptUI Panels folder | yes | yes; a subfolder (one level) of either folder is a submenu named after it | same | [plugins.md](plugins.md) |
|
||||
| Startup / Shutdown folders | yes | not run | missing | plugins.md |
|
||||
| `#include`, `#target` directives | yes | `#include` / `//@include` / `#includepath` inline files relative to the including script (once each, nested at most 32 deep, under the scripts' file gate; errors name the included file and line); `#target`, `#targetengine`, `#strict` are ignored | good | `tests_include.rs` (#759); installed scripts and panels have no folder of their own, so they include from the project's folder or absolute paths |
|
||||
| `.jsxbin` | yes | no | out of scope | No public specification |
|
||||
|
||||
@@ -120,7 +120,7 @@ compositing and effects dominate; audio is light). Hours are to full parity for
|
||||
| Expressions and scripting | 7% | 93% | 65% | 20–40 | `.jsxbin`, Startup/Shutdown folders, script shortcuts (`#include` landed, #759); external editor (#364); see [scripting-parity.md](scripting-parity.md) |
|
||||
| Shapes, masks and roto | 9% | 93% | 45% | 30–50 | Open mask and shape issues (#1004, #999, #1042, #932); #510, #513, #527, #509 and #303 are closed; paste SVG/AI as shape layers (26.3; SVG markup pastes since #738) |
|
||||
| Text and typography | 7% | 94% | 50% | 20–35 | CJK text in comps renders wrongly (#453); paragraph alignment inverted (#316); soft text at Fit (#417, mostly fixed by #444); toolbar font options (#550); #483 and #583 are closed; variable-font filter landed (#741) |
|
||||
| Effects and animation presets | 14% | 85% | 40% | 70–130 | All 306 effects exist, but rendered output is unmeasured against After Effects; 54 built-in presets (text, Transitions, Backgrounds) against After Effects' 621 ([effects-parity.md](effects-parity.md)); open effect bugs (#580 crash, #463, #369, #473, #474; #514 and #526 are closed); effect colour labels (26.5); see [effects-parity.md](effects-parity.md) |
|
||||
| Effects and animation presets | 14% | 85% | 40% | 70–130 | All 306 effects exist, but rendered output is unmeasured against After Effects; 76 built-in presets (text, Transitions, Backgrounds, Behaviors) against After Effects' 621 ([effects-parity.md](effects-parity.md)); open effect bugs (#580 crash, #463, #369, #473, #474; #514 and #526 are closed); effect colour labels (26.5); see [effects-parity.md](effects-parity.md) |
|
||||
| 3D (Classic and Advanced) | 6% | 82% | 35% | 35–65 | No FBX/USD/STL models, no Substance materials, mesh displacement unverified; no 3D transform gizmos (#392, #347); reflections (#261); camera aperture (#260); #489 and #315 are closed |
|
||||
| Tracking and AI-assisted tools | 5% | 80% | 35% | 35–70 | Object Matte (26.2) has the effect, the viewer tool (click / box), background tracking, Freeze and the 26.5 disk cache, not yet compared with After Effects; Roto Brush (MobileSAM) and face tracking (MediaPipe) unmeasured against After Effects; camera-tracker view (#505) |
|
||||
| Preview and cache | 7% | 92% | 40% | 25–50 | Playback stutters on cached frames (#595, #304); late audio (#504, #335); #329 and #554 are closed; no benchmark against After Effects |
|
||||
|
||||
@@ -5,6 +5,10 @@ cargo test --workspace # everything
|
||||
cargo xtask ci # fmt, clippy -D warnings, tests, layers, assets, wasm
|
||||
```
|
||||
|
||||
The `dev` profile keeps debug info to line tables (fast builds, readable backtraces). To debug
|
||||
interactively — local variables, parameters, column breakpoints — build with the `dev-full`
|
||||
profile: `cargo run --profile dev-full -p effectcraft -- --demo` (see `CONTRIBUTING.md`).
|
||||
|
||||
`cargo xtask ci` builds in the dev profile and runs the tests with `cargo nextest run` (plus
|
||||
`cargo test --doc`) when `cargo-nextest` is installed, and with `cargo test` otherwise. It then
|
||||
runs `missing_translations_report` with `--nocapture`, which prints the interface strings each
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
# User docs: rules for agents and contributors
|
||||
|
||||
Everything in this folder (except this file, CLAUDE.md and README.md) is published at
|
||||
https://getartcraft.com/docs/effectcraft. The file path is the URL:
|
||||
`troubleshooting/gpu-not-used.md` → `/docs/effectcraft/troubleshooting/gpu-not-used`.
|
||||
Renaming a file breaks links, so add the old path to `redirect_from` when you rename.
|
||||
|
||||
## Who reads this
|
||||
|
||||
Artists using EffectCraft, Discord mods answering them, and AI assistants looking things up for
|
||||
either. Write for an artist, not a developer.
|
||||
|
||||
## Page rules
|
||||
|
||||
- One question or problem per page. Lead with the answer or the fix in the first two lines.
|
||||
- Plain words, short sentences, numbered steps for anything the reader does.
|
||||
- Start the body at `##`. The page title comes from frontmatter.
|
||||
- Link to other pages instead of repeating them. Use relative links to the `.md` file:
|
||||
`[Install EffectCraft](../getting-started/install.md)`.
|
||||
- No marketing copy, no "simply", no claims you have not checked in the code, a release or an issue.
|
||||
- Call the product "EffectCraft", as the app, its downloads and getartcraft.com do.
|
||||
- Name UI labels exactly as the app shows them, in **bold**. Menu paths use the menu text from
|
||||
`crates/engine/src/menus.rs`.
|
||||
- Shortcuts: the code writes `Cmd`, which is Ctrl on Windows and Linux. Write Ctrl for Windows.
|
||||
- Windows 11 is the only Windows version to name.
|
||||
- Troubleshooting pages: `## Symptoms`, `## Fix`, `## Why this happens` (optional),
|
||||
`## Still stuck?` (link the issue tracker or Discord).
|
||||
|
||||
## Frontmatter
|
||||
|
||||
---
|
||||
title: EffectCraft does not use my graphics card
|
||||
description: One sentence for search results, link previews and AI summaries.
|
||||
order: 10 # optional, sorts within the folder (lower first)
|
||||
verified: 0.8.0 # optional, app version you last checked this page against
|
||||
redirect_from: [old/path] # optional, old URLs (relative to /docs/effectcraft)
|
||||
---
|
||||
|
||||
Only `key: value` and `key: [a, b]` lines work. Quote values that start with a quote or contain ` #`.
|
||||
|
||||
Set `verified` to the latest release (the newest release tag) after checking the page against that tag with `git show <tag>:<path>`. Pages describe the latest release users download, not unreleased code on main.
|
||||
|
||||
## Folders
|
||||
|
||||
- `getting-started/` install and first run
|
||||
- `guides/` how to do one thing
|
||||
- `troubleshooting/` symptom → fix
|
||||
- `faq/` short answers
|
||||
- `reference/` lists and settings
|
||||
|
||||
A folder's `index.md` names the folder in the sidebar. Files or folders starting with `_` are
|
||||
drafts and are not published.
|
||||
|
||||
## Check before you push
|
||||
|
||||
node <path to your artcraft-services checkout>/frontend/apps/artcraft-website-next/scripts/docs/core.mjs docs/user
|
||||
|
||||
The checker lives in storytold/artcraft-services. A CI check will be added once it is on that repo's main branch.
|
||||
|
||||
## Support PRs
|
||||
|
||||
Pages written to answer a user question come in as PRs titled `docs(support): <page title>`.
|
||||
Review them like code: check every claim against the source. Problems and bug reports go in the
|
||||
[issue tracker](https://github.com/storytold/effectcraft/issues).
|
||||
@@ -0,0 +1 @@
|
||||
Read `AGENTS.md` in this folder: it has the rules for the user docs.
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
title: Can EffectCraft open After Effects projects?
|
||||
description: EffectCraft cannot open .aep or .aepx files, and After Effects plug-ins do not run. It saves .ecproj files and imports Lottie.
|
||||
order: 10
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
No. EffectCraft cannot open After Effects projects (`.aep` or `.aepx`), and After Effects plug-ins do not run in it.
|
||||
|
||||
## What it opens instead
|
||||
|
||||
- Its own projects, saved as `.ecproj`. These are readable, versioned JSON files.
|
||||
- Lottie animations, with **File ▸ Import ▸ Lottie...**. Each opens as a new composition.
|
||||
- Photoshop and PDF or Illustrator files, imported as footage or as a composition. See [Import footage and image sequences](../guides/import-footage.md).
|
||||
|
||||
## What carries over
|
||||
|
||||
Expressions are JavaScript with the After Effects object model, such as `wiggle`, `loopOut` and `thisComp.layer("...")`. The panels, shortcuts and effect parameter names follow After Effects, so the skills carry over.
|
||||
|
||||
## Status
|
||||
|
||||
Reading `.aep` files is the largest known gap between EffectCraft and After Effects. It is listed in the project's [gap list](https://github.com/storytold/effectcraft/blob/main/docs/gaps.md), and the maintainers have not yet decided how to approach it.
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: FAQ
|
||||
description: Short answers about EffectCraft.
|
||||
order: 40
|
||||
---
|
||||
|
||||
- [Can EffectCraft open After Effects projects?](after-effects-projects.md)
|
||||
- [Is EffectCraft free, and where does it run?](price-and-platforms.md)
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
title: Is EffectCraft free, and where does it run?
|
||||
description: EffectCraft is free and open source under MIT or Apache-2.0, and runs on Windows, macOS, Linux and in the browser.
|
||||
order: 20
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
Yes, EffectCraft is free. It is open source, dual-licensed under MIT or Apache-2.0, at your option. It has no telemetry, and it uses no network access unless you ask for it.
|
||||
|
||||
## Where it runs
|
||||
|
||||
| Platform | Builds |
|
||||
|----------|----------------------------------------------------------------------------------------|
|
||||
| Windows | x64, arm64 and 32-bit x86, as MSI installers and portable zips |
|
||||
| macOS | One universal app for Apple silicon and Intel |
|
||||
| Linux | x86_64 and aarch64 as AppImage, Flatpak, deb, rpm and tar.gz; riscv64 deb, rpm, tar.gz |
|
||||
| FreeBSD | x86_64 tar.gz |
|
||||
| Browser | A web build that runs the full app |
|
||||
|
||||
See [Install EffectCraft](../getting-started/install.md) for the files.
|
||||
|
||||
## How mature is it?
|
||||
|
||||
EffectCraft is in alpha. The README calls macOS the most tested platform, and says Linux and Windows users have hit basic interaction bugs that are being fixed first. Bug reports in the [issue tracker](https://github.com/storytold/effectcraft/issues) are the most useful thing you can send.
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Getting started
|
||||
description: Install EffectCraft and make your first composition.
|
||||
order: 10
|
||||
---
|
||||
|
||||
- [Install EffectCraft](install.md)
|
||||
- [Make your first composition](../guides/make-a-composition.md)
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: Install EffectCraft
|
||||
description: Download EffectCraft for Windows 11, macOS or Linux, install it, or install it through ArtCraft Launcher.
|
||||
order: 10
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
The easiest way is the [EffectCraft page on getartcraft.com](https://getartcraft.com/apps/effectcraft). For a specific file, use the [latest release](https://github.com/storytold/effectcraft/releases/latest) on GitHub. In the file names, `<version>` stands for the version number, for example `0.9.2`.
|
||||
|
||||
## Windows 11
|
||||
|
||||
1. Open the [latest release](https://github.com/storytold/effectcraft/releases/latest).
|
||||
2. Download `effectcraft-<version>-windows-x64.msi`. It fits most PCs (Intel and AMD, 64-bit).
|
||||
3. Run the file and follow the installer. It asks where to install EffectCraft and offers a **Create a desktop shortcut** box.
|
||||
4. Start **EffectCraft** from the Start menu.
|
||||
|
||||
The release also has an `arm64` installer for Snapdragon and other ARM PCs. The installers are code-signed and install for all users. Later versions install into the same folder.
|
||||
|
||||
To run it without installing, download `effectcraft-<version>-windows-x64-portable.zip` instead. It contains `effectcraft.exe` and the command-line tool `effectcraft-cli.exe`. The `arm64` build has a portable zip too.
|
||||
|
||||
There are also 32-bit `x86` builds, as an installer and a portable zip.
|
||||
|
||||
## macOS
|
||||
|
||||
1. Download `effectcraft-<version>-macos-universal.dmg`. It works on Apple silicon and Intel Macs and is signed and notarized.
|
||||
2. Open it and drag EffectCraft to Applications.
|
||||
|
||||
The command-line tool is a separate download for macOS: `effectcraft-cli-<version>-macos-universal.zip`.
|
||||
|
||||
## Linux
|
||||
|
||||
Pick one file from the release. Replace `x86_64` with `aarch64` on ARM.
|
||||
|
||||
| File | How to use it |
|
||||
|-----------------------------------------------|------------------------------------------|
|
||||
| `effectcraft-<version>-linux-x86_64.AppImage` | Run `chmod +x` on the file, then run it. |
|
||||
| `effectcraft-<version>-linux-x86_64.deb` | For Debian and Ubuntu. |
|
||||
| `effectcraft-<version>-linux-x86_64.rpm` | For Fedora, RHEL and openSUSE. |
|
||||
| `effectcraft-<version>-linux-x86_64.flatpak` | `flatpak install --user <file>` |
|
||||
| `effectcraft-<version>-linux-x86_64.tar.gz` | Unpack it anywhere. |
|
||||
|
||||
For RISC-V 64-bit there is a `.deb`, an `.rpm` and a `.tar.gz` (`riscv64` in the file name). They need glibc 2.39 or newer. There is also a FreeBSD x86_64 `.tar.gz`.
|
||||
|
||||
## In the browser
|
||||
|
||||
`effectcraft-web-<version>.zip` is the web build. It is a static site that runs in a modern browser and needs to be hosted on a web server. Projects, media and settings stay in the browser's private storage and on your computer.
|
||||
|
||||
## Install through ArtCraft Launcher
|
||||
|
||||
ArtCraft Launcher lists EffectCraft. Click **Install** on its card. See [Install and update Craft apps](https://getartcraft.com/docs/craft-launcher/guides/install-and-update-apps).
|
||||
|
||||
## Check the download
|
||||
|
||||
`SHA256SUMS.txt` on the release page lists a checksum for every file.
|
||||
|
||||
## Next
|
||||
|
||||
Open EffectCraft and make something: [Make your first composition](../guides/make-a-composition.md). If you only want to look around, choose **Open Demo Project** on the Home screen.
|
||||
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: Add an effect
|
||||
description: Apply an effect such as Gaussian Blur to a layer and change its settings in Effect Controls.
|
||||
order: 30
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
Select a layer, then choose the effect from the **Effect** menu, or double-click it in the **Effects & Presets** panel. Change its settings in **Effect Controls** (F3).
|
||||
|
||||
Shortcuts on this page use Ctrl. On macOS, use Cmd instead of Ctrl.
|
||||
|
||||
## Steps
|
||||
|
||||
1. Select a layer in the Timeline.
|
||||
2. Apply an effect in one of two ways:
|
||||
- Choose it from the **Effect** menu. Effects are grouped by category, for example **Effect ▸ Blur & Sharpen ▸ Gaussian Blur**.
|
||||
- Open **Window ▸ Effects & Presets** (Ctrl+5). Type in the search field, then double-click the effect. Dragging it onto a layer works too.
|
||||
3. Open **Window ▸ Effect Controls** (F3), or choose **Effect ▸ Effect Controls**. The effect's settings are listed there. **Gaussian Blur** has **Blurriness**, **Blur Dimensions** and **Repeat Edge Pixels**.
|
||||
4. Change a value. Click the stopwatch beside it to animate it, as in [Animate with keyframes](animate-with-keyframes.md).
|
||||
|
||||
If no layer is selected when you double-click an effect, EffectCraft shows **Select a layer to apply to**. Select a layer and try again.
|
||||
|
||||
## Remove or reuse effects
|
||||
|
||||
- **Effect ▸ Last Effect** applies the effect you used last.
|
||||
- **Effect ▸ Remove All** takes every effect off the selected layers.
|
||||
- In **Effects & Presets**, click the star on an effect to add it to Favorites. Recently used effects are listed too.
|
||||
|
||||
## Layer styles
|
||||
|
||||
For drop shadows, glows and bevels, use **Layer ▸ Layer Styles**. It lists **Drop Shadow**, **Inner Shadow**, **Outer Glow**, **Inner Glow**, **Bevel and Emboss** and **Satin**, among others.
|
||||
|
||||
## Next
|
||||
|
||||
[Render a video](render-a-video.md).
|
||||
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: Animate with keyframes
|
||||
description: Fly a layer in with two Position keyframes and smooth the motion with Easy Ease.
|
||||
order: 20
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
Click the stopwatch beside a property to start animating it, move the current-time indicator, then change the value. The second keyframe appears by itself. Select both keyframes and press F9 to ease the motion.
|
||||
|
||||
You need a composition with a layer. See [Make your first composition](make-a-composition.md).
|
||||
|
||||
Shortcuts on this page use Ctrl. On macOS, use Cmd instead of Ctrl and Option instead of Alt.
|
||||
|
||||
## Steps
|
||||
|
||||
1. In the Timeline, twirl the layer open, then open **Transform**.
|
||||
2. Set the starting value. For a layer that flies in from the left, scrub or type a **Position** that is outside the frame.
|
||||
3. Click the stopwatch beside **Position**. It turns blue and records a keyframe at the current time.
|
||||
4. Drag the blue current-time indicator to about 0:00:01:00, or click in the time ruler.
|
||||
5. Drag the layer to its final place in the Composition viewer, or scrub the **Position** value. Because the stopwatch is on, a second keyframe appears by itself.
|
||||
6. Select both keyframes (drag a box around them, or click the **Position** name) and press F9. This is **Animation ▸ Keyframe Assistant ▸ Easy Ease**. The layer now glides in and settles.
|
||||
7. Press the Spacebar, or use Play in the Preview panel, to watch it. Press it again to stop.
|
||||
|
||||
## Other things you can do
|
||||
|
||||
- Click the keyframe button in the layer's property row to add or remove a keyframe at the current time. Its tooltip reads **Add or remove keyframe**.
|
||||
- Choose **Animation ▸ Keyframe Assistant ▸ Easy Ease In** (Shift+F9) or **Easy Ease Out** to ease one side only.
|
||||
- Choose **Animation ▸ Toggle Hold Keyframe** for a keyframe that jumps instead of moving.
|
||||
- Choose **Animation ▸ Keyframe Interpolation...** or **Keyframe Velocity...** to set the curve exactly.
|
||||
- Hold Alt and click a stopwatch to add an expression.
|
||||
- The Graph Editor shows value and speed graphs with draggable handles.
|
||||
|
||||
## Next
|
||||
|
||||
[Add an effect](add-an-effect.md).
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: Import footage and image sequences
|
||||
description: Bring video, images and numbered image sequences into an EffectCraft project, and change how footage is read.
|
||||
order: 50
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
Choose **File ▸ Import ▸ File...** (Ctrl+I) and pick your files, or drop files on the EffectCraft window. Numbered stills such as `shot_0001.png` can import as one sequence that plays like a movie.
|
||||
|
||||
Shortcuts on this page use Ctrl. On macOS, use Cmd instead of Ctrl and Option instead of Alt.
|
||||
|
||||
## Import files
|
||||
|
||||
1. Choose **File ▸ Import ▸ File...** to pick one file. Use **File ▸ Import ▸ Multiple Files...** to pick several.
|
||||
2. Photoshop and PDF or Illustrator files first ask whether to import them as footage or as a composition.
|
||||
3. The footage appears in the Project panel. Drag it onto the Composition viewer to make a layer where you drop it, or into the Timeline. If no composition is open, dropping it on the empty viewer makes a new composition from it.
|
||||
|
||||
You can also drop files or folders on the window. Files dropped on the Composition viewer become layers there. A dropped Photoshop file asks how to import it, as **File ▸ Import ▸ File...** does. The **Media Browser** (**Window ▸ Media Browser**) browses folders and imports what you pick.
|
||||
|
||||
## Import an image sequence
|
||||
|
||||
1. Choose **File ▸ Import ▸ File...** and pick any one numbered file of the run.
|
||||
2. In the **Import Image Sequence** dialog, check the run it found. It also lists missing frames.
|
||||
3. Tick the sequence option, which is named after the file type, for example **PNG Sequence**. When it is off, the files import as separate stills. It is off by default.
|
||||
4. Set **Frame rate (fps)**. The default comes from **Sequence Footage** on the Import page of the preferences (**Edit ▸ Preferences ▸ Import...**; on macOS: **EffectCraft ▸ Settings... ▸ Import...**), which is 30 fps.
|
||||
5. Confirm. The run arrives as one footage item named like `shot_[0001-0250].png`.
|
||||
|
||||
**Force alphabetical order** imports every image of that type in the folder in name order, whatever the numbering. Use it for files that are not numbered consistently.
|
||||
|
||||
Stills in PNG, JPEG, TIFF, OpenEXR, BMP, WebP, Targa (`.tga`), Radiance HDR (`.hdr`), DPX and Cineon (`.cin`) can form a sequence. PSD, SVG and PDF files import one by one.
|
||||
|
||||
If the numbering skips a frame, EffectCraft shows colour bars for it. Put the missing files in the folder and choose **File ▸ Reload Footage** to fill the gap.
|
||||
|
||||
## Change how footage is read
|
||||
|
||||
Select the footage in the Project panel and choose **File ▸ Interpret Footage ▸ Main...** (Ctrl+Alt+G). The dialog has **Alpha**, **Assume this frame rate** and **Start Timecode**, among others. A change applies everywhere the footage is used.
|
||||
|
||||
For example, a 250-frame sequence at 25 fps lasts 10 seconds. At 24 fps it lasts 10.4 seconds.
|
||||
|
||||
## Replace or reload footage
|
||||
|
||||
- **File ▸ Replace Footage ▸ File...** (Ctrl+H) points the item at another file.
|
||||
- **File ▸ Reload Footage** (Ctrl+Alt+L) reads the files again. A sequence picks up frames added to its folder.
|
||||
|
||||
If footage shows as missing, see [Footage is missing or offline](../troubleshooting/footage-missing.md).
|
||||
|
||||
## Linux with Wayland
|
||||
|
||||
Dragging files onto the window does not work on native Wayland sessions. Use **File ▸ Import ▸ File...** instead.
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
title: Guides
|
||||
description: Step-by-step guides for the main tasks in EffectCraft.
|
||||
order: 20
|
||||
---
|
||||
|
||||
- [Make your first composition](make-a-composition.md)
|
||||
- [Animate with keyframes](animate-with-keyframes.md)
|
||||
- [Add an effect](add-an-effect.md)
|
||||
- [Render a video](render-a-video.md)
|
||||
- [Import footage and image sequences](import-footage.md)
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Make your first composition
|
||||
description: Create a composition, add a text layer and save the project as an .ecproj file.
|
||||
order: 10
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
Choose **Composition ▸ New Composition...**, set the size, frame rate and duration, click **OK**, then add layers from the **Layer ▸ New** menu. Shortcuts below use Ctrl on Windows and Linux. On macOS, use Cmd.
|
||||
|
||||
## Steps
|
||||
|
||||
1. Choose **Composition ▸ New Composition...** (Ctrl+N). On the Home screen, click **New Composition** instead.
|
||||
2. In the dialog, type a **Composition Name**. The default is `Comp 1`.
|
||||
3. Pick a **Preset**, or set **Width**, **Height**, **Frame Rate** and **Duration**. The presets include `HDTV 1080 24`, `UHD 4K 25` and `Social Media Square · 1080x1080 · 30 fps`.
|
||||
4. Click **OK**. The composition opens in the Composition panel and the Timeline.
|
||||
5. Choose **Layer ▸ New ▸ Text** and type your text. A text layer appears at the top of the Timeline, and its name follows what you type.
|
||||
6. Add more layers from **Layer ▸ New**: **Solid...**, **Shape Layer**, **Null Object**, **Adjustment Layer**, **Light...** and **Camera...**.
|
||||
7. Choose **File ▸ Save** to save the project.
|
||||
|
||||
Projects are saved as `.ecproj` files. An `.ecproj` file is readable JSON, so it also works with version control.
|
||||
|
||||
## Change the settings later
|
||||
|
||||
Choose **Composition ▸ Composition Settings...** to change the name, size, frame rate or duration. The dialog has **Basic**, **Advanced** and **3D Renderer** tabs.
|
||||
|
||||
To keep a size and frame rate for later, click the **+** button next to **Preset** (**Save Preset…**) and name it. Your presets are listed above the built-in ones, in this dialog and in **New Composition...**. To remove one, select it and click the bin button (**Delete Preset**).
|
||||
|
||||
## Learn in the app
|
||||
|
||||
The in-app tutorial **Animate a title** walks through a similar title animation. To open it, choose **Help ▸ In-App Tutorials...**.
|
||||
|
||||
## Next
|
||||
|
||||
[Animate with keyframes](animate-with-keyframes.md).
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
title: Render a video
|
||||
description: Add a composition to the Render Queue, choose a format such as H.264, pick where to save and click Render.
|
||||
order: 40
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
Select the composition, choose **Composition ▸ Add to Render Queue** (Ctrl+M), set the output file, then click **Render** in the Render Queue panel. The default format is H.264, saved as an `.mp4` file named after the composition.
|
||||
|
||||
Shortcuts on this page use Ctrl. On macOS, use Cmd instead of Ctrl and Option instead of Alt.
|
||||
|
||||
## Steps
|
||||
|
||||
1. Select the composition in the Project panel or open it.
|
||||
2. Choose **Composition ▸ Add to Render Queue** (Ctrl+M). You can also drag compositions onto the Render Queue panel. Open the panel with **Window ▸ Render Queue** (Ctrl+Alt+0).
|
||||
3. The queue lists the item with its **Comp Name**, **Status**, **Started** and **Render Time**. Twirl the item open to see **Render Settings:**, **Output Module:** and **Output To**.
|
||||
4. Click **Output Module:** and choose a format. The menu entries read **Format: H.264**, **Format: QuickTime (ProRes)** and so on.
|
||||
5. Click the file name next to **Output To** to choose where to save. Alt-click it to edit the name template instead.
|
||||
6. Check that the **Render** tick box at the left of the item is on. It is on by default, and only ticked items render.
|
||||
7. Click **Render**. The status changes to **Rendering** with a percentage. Click **Stop** to cancel.
|
||||
|
||||
Tick **Notify** to get a sound and a notification when the queue finishes.
|
||||
|
||||
## Formats
|
||||
|
||||
The **Output Module:** menu lists the formats your build can export:
|
||||
|
||||
| Menu entry | File type |
|
||||
|--------------------------|-----------------------------|
|
||||
| H.264 | `.mp4` |
|
||||
| QuickTime (ProRes) | `.mov` |
|
||||
| QuickTime (Uncompressed) | `.mov` |
|
||||
| HEVC (H.265) | `.mp4` |
|
||||
| AV1 | `.mp4` |
|
||||
| WebM (VP9 + Opus) | `.webm` |
|
||||
| PNG Sequence | `.png`, one file per frame |
|
||||
| JPEG Sequence | `.jpg`, one file per frame |
|
||||
| TIFF Sequence | `.tif`, one file per frame |
|
||||
| OpenEXR Sequence | `.exr`, one file per frame |
|
||||
| Animated GIF | `.gif` |
|
||||
| WAV | `.wav`, audio only |
|
||||
| AIFF | `.aif`, audio only |
|
||||
|
||||
To keep transparency, choose **Channels: RGB + Alpha** in the **Output Module:** menu. It appears for formats that can store alpha, such as QuickTime (ProRes), QuickTime (Uncompressed) and PNG Sequence. H.264, HEVC, AV1 and JPEG Sequence cannot.
|
||||
|
||||
## Render only part of a composition
|
||||
|
||||
Click **Render Settings:** and choose **Time Span: Work Area Only** or **Time Span: Length of Comp**. The same menu sets **Quality: Best** or **Quality: Draft** and the resolution (**Resolution: Full**, **Half**, **Third** or **Quarter**).
|
||||
|
||||
## Export a Lottie animation instead
|
||||
|
||||
Choose **File ▸ Export ▸ Lottie JSON...** to write a composition as `.json` or `.lottie`. EffectCraft lists anything Lottie cannot express. To open one, choose **File ▸ Import ▸ Lottie...**.
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
title: EffectCraft
|
||||
description: EffectCraft is a free, open-source app for motion graphics and visual effects, an alternative to Adobe After Effects.
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
EffectCraft is a free, open-source app for animated titles, motion graphics and compositing. It is an alternative to Adobe After Effects.
|
||||
|
||||
You build a composition from layers (solids, shapes, text, footage, other compositions), animate their properties with keyframes, add effects and render the result. The panels and shortcuts follow After Effects: Project, Composition, Timeline, Effect Controls, Effects & Presets and the Render Queue. It runs on macOS, Windows and Linux, and in the browser.
|
||||
|
||||
EffectCraft is young and in alpha. It cannot open After Effects projects (`.aep`), and some things still behave differently from After Effects. See [Can EffectCraft open After Effects projects?](faq/after-effects-projects.md).
|
||||
|
||||
## Start here
|
||||
|
||||
- [Install EffectCraft](getting-started/install.md)
|
||||
- [Make your first composition](guides/make-a-composition.md)
|
||||
- [Animate with keyframes](guides/animate-with-keyframes.md)
|
||||
- [Add an effect](guides/add-an-effect.md)
|
||||
- [Render a video](guides/render-a-video.md)
|
||||
- [Import footage and image sequences](guides/import-footage.md)
|
||||
|
||||
## When something is wrong
|
||||
|
||||
- [EffectCraft does not use my graphics card](troubleshooting/gpu-not-used.md)
|
||||
- [Footage is missing or offline](troubleshooting/footage-missing.md)
|
||||
|
||||
## Sections
|
||||
|
||||
- [Getting started](getting-started/index.md)
|
||||
- [Guides](guides/index.md)
|
||||
- [Troubleshooting](troubleshooting/index.md)
|
||||
- [FAQ](faq/index.md)
|
||||
|
||||
## Get help
|
||||
|
||||
Ask in [Discord](https://discord.gg/artcraft) or open an issue in the [issue tracker](https://github.com/storytold/effectcraft/issues). Say which version and which system you use.
|
||||
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: Footage is missing or offline
|
||||
description: Find missing footage in an EffectCraft project, relink it to a folder or replace it with another file.
|
||||
order: 20
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
Choose **File ▸ Dependencies ▸ Relink Missing Footage...** and pick the folder where your files are now. For files that stay missing, choose **File ▸ Replace Footage ▸ File...**.
|
||||
|
||||
Shortcuts on this page use Ctrl. On macOS, use Cmd instead of Ctrl and Option instead of Alt.
|
||||
|
||||
## Symptoms
|
||||
|
||||
- A footage item in the Project panel is flagged as missing after you open a project.
|
||||
- EffectCraft shows a message that footage items are missing.
|
||||
|
||||
## Fix
|
||||
|
||||
1. Choose **File ▸ Dependencies ▸ Find Missing Footage**. EffectCraft selects every missing item in the Project panel and shows how many it found.
|
||||
2. Choose **File ▸ Dependencies ▸ Relink Missing Footage...** and pick the folder that holds your files. EffectCraft searches that folder and its subfolders.
|
||||
3. It relinks files whose names are unique and whose type, dimensions and codec match what the project saved. The whole relink is one undo step.
|
||||
4. For anything left over, select the item and choose **File ▸ Replace Footage ▸ File...** (Ctrl+H), then pick the file yourself. This also covers files with duplicate names in the folder, which Relink leaves alone.
|
||||
5. After you copy or render files into a folder, choose **File ▸ Reload Footage** (Ctrl+Alt+L) to read them again.
|
||||
|
||||
Relinking keeps item names, interpretation and layer timing. It does not change your files. For image sequences, every saved frame must be in the new folder. Relink Missing Footage is not available in the browser version.
|
||||
|
||||
## Why this happens
|
||||
|
||||
A project stores where each footage file is. If you move or rename the files, or open the project on another computer, the project cannot find them.
|
||||
|
||||
Projects built with the command-line tool or an agent can use relative paths such as `bg.mp4`. Before 0.8.0, the app looked for those in its own working directory instead of next to the project file. Since 0.8.0 it also looks next to the project file ([pull request #676](https://github.com/storytold/effectcraft/pull/676)). The reporter on macOS has not confirmed the fix yet ([issue #652](https://github.com/storytold/effectcraft/issues/652)).
|
||||
|
||||
## Still stuck?
|
||||
|
||||
Ask in [Discord](https://discord.gg/artcraft) or open an issue in the [issue tracker](https://github.com/storytold/effectcraft/issues). Say which system you use, whether the project came from another computer or from the command-line tool, and where the footage is stored.
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: EffectCraft does not use my graphics card
|
||||
description: What to do when the report says GPU none (CPU compositing), the window picked another adapter, or GPU effects fail on Windows 11 with DirectX 12.
|
||||
order: 10
|
||||
verified: 0.9.2
|
||||
---
|
||||
|
||||
Open **Help ▸ System Compatibility Report...** and read the **GPU:** and **Window graphics:** lines. If the window runs on the wrong adapter, set **Window Graphics** to **Automatic** in the preferences (**Edit ▸ Preferences ▸ Startup & Repair...**; on macOS: **EffectCraft ▸ Settings... ▸ Startup & Repair...**) and restart EffectCraft.
|
||||
|
||||
## Symptoms
|
||||
|
||||
- The report says `GPU: none (CPU compositing)` followed by a reason.
|
||||
- The `Window graphics:` line names an adapter or backend you did not expect, for example an integrated or OpenGL adapter instead of your graphics card.
|
||||
|
||||
## Fix
|
||||
|
||||
1. Choose **Help ▸ System Compatibility Report...**. Copy the text.
|
||||
2. Look at the `Window graphics:` line. If it shows the wrong adapter, continue. If it shows your card, go to **Still stuck?** below.
|
||||
3. Choose **Edit ▸ Preferences ▸ Startup & Repair...**. On macOS, choose **EffectCraft ▸ Settings... ▸ Startup & Repair...**.
|
||||
4. Set **Window Graphics** to **Automatic**. The other choice is **OpenGL (compatibility)**.
|
||||
5. Close EffectCraft and start it again. The change applies from the next launch.
|
||||
6. Open the report again and check that `Window graphics:` now names your card.
|
||||
|
||||
One user whose GPU was not detected on 0.8.0 fixed it this way: they set the window graphics to Automatic, and EffectCraft started through Vulkan ([issue #596](https://github.com/storytold/effectcraft/issues/596)).
|
||||
|
||||
If the window runs on your card but the report still says `GPU: none (CPU compositing)`, the reason after it says why the GPU compositor did not start. With **OpenGL (compatibility)**, compositing always runs on the CPU, because the GPU compositor needs DirectX 12, Vulkan, Metal or WebGPU.
|
||||
|
||||
## Why this happens
|
||||
|
||||
When the graphics driver stops EffectCraft as its window opens, the next launch switches to OpenGL by itself. That keeps the app usable. Setting **Window Graphics** to **Automatic** lets EffectCraft choose the graphics backend again.
|
||||
|
||||
The **GPU Information...** button on the Previews page of the preferences names the adapter the GPU compositor runs on. When compositing runs on the CPU, it says why after `GPU compositing is off:`. It also shows the `Window graphics:` line. For a bug report, still send the whole System Compatibility Report.
|
||||
|
||||
## Windows 11 with DirectX 12
|
||||
|
||||
On some Windows 11 PCs with NVIDIA GPUs, the GPU compositor fails to start on DirectX 12 because the FXC shader compiler rejects some of EffectCraft's GPU kernels. Two users reproduced this with an RTX 4060 laptop GPU and an RTX 3060. In their tests EffectCraft fell back to CPU compositing, and the same build started on Vulkan. This is still open in 0.9.2 as [issue #613](https://github.com/storytold/effectcraft/issues/613). Check the issue for updates.
|
||||
|
||||
The window can also take a long time to appear. On 0.8.0 with an RTX 5060 Ti, one user measured 69 seconds before the window showed on DirectX 12 without a working DXC shader compiler, against 3 seconds on Vulkan, which is what Automatic picked on that PC. If you close EffectCraft during that wait, the next launch uses OpenGL and has no GPU compositor until you set **Window Graphics** back to **Automatic** (steps above). So wait for the window on the first launch.
|
||||
|
||||
## Still stuck?
|
||||
|
||||
Ask in [Discord](https://discord.gg/artcraft) or open an issue in the [issue tracker](https://github.com/storytold/effectcraft/issues). Include the whole System Compatibility Report, your graphics card and driver version, and whether you also have an integrated GPU.
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Troubleshooting
|
||||
description: Fixes for common EffectCraft problems.
|
||||
order: 30
|
||||
---
|
||||
|
||||
- [EffectCraft does not use my graphics card](gpu-not-used.md)
|
||||
- [Footage is missing or offline](footage-missing.md)
|
||||
|
||||
Not listed? Open an issue in the [issue tracker](https://github.com/storytold/effectcraft/issues) or ask in [Discord](https://discord.gg/artcraft). Include the text from **Help ▸ System Compatibility Report...**.
|
||||
+19
@@ -242,6 +242,25 @@ Window ▸ Media Browser browses a virtual tree (`src/browse.rs`):
|
||||
|
||||
`mediaBrowser.list` reports the places and these actions; `mediaBrowser.action {action}` runs one.
|
||||
|
||||
### Startup project
|
||||
|
||||
By default the page opens the last visit's project, and the demo project on a first visit. A
|
||||
`startup` key in `effectcraft-config.json` (next to `index.html`) changes that:
|
||||
|
||||
```json
|
||||
{"startup":"empty"}
|
||||
```
|
||||
|
||||
| Value | On load |
|
||||
|---|---|
|
||||
| `"last"` (or no key) | the last visit's project; the demo project on a first visit |
|
||||
| `"empty"` | the last visit's project; a blank project on a first visit, never the demo |
|
||||
| `"demo"` | the demo project, whatever the last visit left; the session is not saved, so the last visit's project stays as it was |
|
||||
|
||||
The `?empty` and `?demo` URL flags still win. A missing, invalid or non-JSON file, or an unknown
|
||||
value, is the default. The file is fetched once per page load; serve it with
|
||||
`Cache-Control: no-cache` (the service worker never caches it).
|
||||
|
||||
### Audio
|
||||
|
||||
Audio preview goes through **Web Audio**: an AudioWorklet (`audio-worklet.js`; a
|
||||
|
||||
Reference in New Issue
Block a user