Changelog

See what's new in Artidor

0.3.02026-04-15

Masks, animation & more

This release adds masks, a graph editor for keyframe curves, volume and speed controls, preview zoom, canvas backgrounds, stickers, and a lot more.

Features:

  • Added a brand page with downloadable brand assets. Assets are also accessible directly from the header logo context menu.
  • Scale now has separate width and height controls. You can stretch or squash elements independently on each axis.
  • Volume control for audio and video elements, both in the properties panel and inline on timeline clips.
  • Speed control for video and audio clips. Includes a maintain pitch option so audio doesn't chipmunk or deepen when you change the rate.
  • Masks. Hide or reveal parts of any video or image layer. Choose from split, rectangle, ellipse, star, heart, diamond, and cinematic bars. Adjust position, size, rotation, feather, and stroke in the properties panel, or drag the handles in the preview.
  • Canvas backgrounds are back. Set a blur, solid color, or gradient as the canvas background from the new Background tab in the settings panel.
  • Custom canvas size. Instead of being locked to a handful of presets, you can now enter any width and height you want.
  • Preview zoom and panning. Zoom into the canvas to work on fine details, and pan around to navigate when zoomed in.
  • Stickers panel now has content. Browse and add logos, country flags, and shapes.
  • You can now import transcript files to generate captions instead of running auto-transcription.
  • Graph editor for keyframe curves. Shape the easing between keyframes by dragging bezier handles.
  • Multiple selected timeline clips move and resize together.
  • Position X and Y can now be animated independently.
  • Keyframes can be copied and pasted between elements.
  • Timeline clips can expand to show a lane for each animated property. Right-click a clip -> "Expand keyframes" to see all properties in their own rows.

Improvements:

  • Added a changelog link to the footer.
  • Playback performance is dramatically better. The editor used to slow to a crawl during playback, and audio would stutter when interacting with elements mid-play. Both are fixed.
  • More vertical space between timeline tracks. Selection outlines on adjacent tracks no longer overlap each other.
  • Holding Shift or Ctrl while drag-selecting in the timeline now adds to your existing selection instead of replacing it. Matches how Shift/Ctrl+click already worked.
  • Timeline track rows now highlight when they contain a selected element, making it easier to see which tracks are active at a glance.
  • System fonts (Arial, Helvetica, Times New Roman, and others) now appear in the font picker alongside Google Fonts.
  • Your projects can disappear if your disk runs low on space. OpenCut now asks the browser to protect them.
  • The properties panel has been redesigned with a tabbed layout.
  • Audio waveforms have gotten an upgrade. The old ones were inaccurate, prone to crashing, and not very useful. The new ones are RMS-based, properly scaled, and only render what's visible so they don't slow things down.
  • The timeline now opens scrolled to the bottom, so your main video track is visible right away instead of being hidden above the fold.
  • The settings panel has been redesigned with a cleaner layout and better organization.
  • You can now select multiple assets in the assets panel. Useful for deleting several at once.
  • If your browser doesn't support GPU-accelerated rendering, the editor now shows a notice explaining why and suggests switching to another browser.

Fixes:

  • Sponsor logos now correctly invert in dark mode.
  • Media asset cards in the grid view were larger than their thumbnails, leaving empty space around each item. Cards now size to their content.
  • Project thumbnails now generate correctly even when the timeline is empty. If you set a background color or gradient with no clips, the thumbnail reflects that instead of staying blank.
  • Clicking a selected element no longer keeps the rest of the selection.
  • Track labels on the left side of the timeline were misaligned with the tracks on the right.
  • Clicking in the empty space below timeline tracks now seeks the playhead.
  • Timeline vertical scroll now works anywhere in the panel, not just over the track labels. The header no longer scrolls with the tracks.
  • MP4 exports with audio failed on Firefox. The export now completes successfully regardless of browser.
  • Snap guides in the preview panel didn't show when moving a full-canvas element to the center of the frame.
  • The rotation handle could float above the editor UI when an element was near the top of the canvas. It now clips to the preview area.
  • Images with a blur effect at 0% intensity would disappear completely when a blurred background was also active. Now 0% blur correctly renders the image unchanged.
  • Section titles in the properties panel showed the wrong text color when the section wasn't collapsible. Non-collapsible titles now use the correct muted style.
  • Blur looked pixelated at higher intensities instead of producing a real blur. Both the canvas background blur and the blur effect are now fixed.
  • Auto-generated captions were sometimes inaccurate. The underlying issue has been fixed.
  • Text element handles no longer shift position as you type.
  • The rotation handle drifted further and further from the element as the canvas size got smaller. On a 100x100 project it was almost off-screen. The gap is now a fixed size regardless of canvas dimensions or zoom.
Technical details:
  • Ripple editing now has a proper algorithmic foundation. The old inline approach was replaced with a diff-based system in src/lib/ripple/: track snapshots before and after an operation are compared as interval sets, vacated intervals are computed (accounting for elements moved to other tracks), and the result is a list of explicit RippleAdjustment values applied in a separate pass. Composable, testable, and independent of the command that triggered it.
  • Time is now represented as MediaTime, an integer tick count at 120,000 ticks per second, defined in rust/crates/time. Previously, floating-point seconds were used throughout, which accumulated rounding errors and made frame alignment imprecise. 120,000 was chosen because it divides evenly by every standard frame rate denominator, including drop-frame rates: 23.976 maps to 5,005 ticks/frame, 29.97 to 4,004, 30 to 4,000. FrameRate is a rational {numerator, denominator} type rather than a float. All time arithmetic, frame snapping, and timecode formatting are implemented in Rust and exposed via WASM.
  • Track ordering is now enforced at the type level. SceneTracks replaces a flat track array with three explicit fields: overlay, main (a singleton VideoTrack), and audio. The type makes it structurally impossible to mix track kinds or misplace a track.
  • The WebGL renderer has been replaced with a Rust/wgpu compositor compiled to WASM. The rust/ crate tree covers compositing (rust/crates/compositor), effects (rust/crates/effects), masks with JFA-based feathering (rust/crates/masks), GPU context (rust/crates/gpu), and time (rust/crates/time). WASM bindings live in rust/wasm/ and are consumed from TypeScript through src/lib/wasm/. The old GLSL shaders and WebGL utilities are gone.
  • src/types/ and src/constants/ have been dissolved. All types and constants now live alongside the code that owns them inside src/lib/. The packages/env and packages/ui internal packages were also folded into the web app, with icons at src/components/icons/ and env at src/lib/env/.
  • The web app can now deploy to Cloudflare Workers via OpenNext. wrangler.jsonc and apps/web/open-next.config.ts are included for anyone self-hosting.
  • apps/desktop/ is a new GPUI + Rust app. It is early: there is a main.rs and a working build setup, but no features yet.
  • 16 new storage migration steps were added (v9 through v25), covering the schema changes accumulated during this release cycle.
0.2.02026-03-01

Motion & effects

This release adds the foundation for motion and effects, alongside many improvements & fixes.

Features:

  • Keyframe animation system for animating element properties over time.
  • Entirely new efects system. Effects can be applied per-clip or added as standalone elements on the timeline (with our first effect: Blur!)
  • Added a changelog page to the site.
  • Ripple editing mode.

Improvements:

  • New text elements no longer have a black background by default.
  • Selection outline in the preview is now dashed.
  • Clips sitting next to each other on the timeline now have a small gap between them so selected clips are always clearly visible.
  • Press Escape to deselect the current element.

Fixes:

  • Fixed an issue where click-and-drag selection on one timeline track could accidentally select items from the track below.
  • Audio could flicker or cut out at the start of playback when certain elements were selected. The scheduler now recovers from timing slips without losing audio.
  • Dragging a clip onto the timeline and pressing Ctrl+Z now removes both the clip and the track it created in one step, instead of requiring two undos.
  • A few values in the properties panel were previously showing incorrect values. This has been fixed.
  • Timeline trim handles now sit outside the clip instead of inside them, so the clip's visible area accurately represents where it starts and ends.
  • Clips being dragged on the timeline now render on top of other clips instead of underneath them.
  • Undoing a trim-from-start operation now correctly restores the clip to its original position and length, instead of stretching it to the right.
  • Resizing a clip on the timeline would deselect it when the mouse was released. The clip now stays selected after a resize.
  • Resizing a clip could extend it past another clip on the same track, causing an overlap. The resize now stops at the next clip's edge.
  • Dragging a clip to a different track would deselect it on drop. The clip stays selected after moving.
  • Finishing a resize or drag with the mouse over empty track space would deselect the clip.
0.1.02026-02-23

Editor foundation

This first release focuses on making editing faster, clearer, and more reliable for day-to-day use.

Features:

  • Rebuilt the properties panel from scratch. Number inputs now support math expressions and click-drag scrubbing instead of just typing values in.
  • The properties panel went from a flat list of basic text styles to organized sections: transform, blending, typography, spacing, and background controls. Text elements finally have position, scale, and rotation.
  • New color picker with eyedropper, opacity control, and multiple color formats.
  • Bookmarks now support notes, color labels, and optional duration to plan scenes more clearly.
  • Move, scale, and rotate elements directly in the preview panel.
  • Blend modes (Multiply, Screen, Overlay, etc). Only available on text elements for now.
  • Paste images, videos, or audio from your clipboard straight into the editor.
  • Hold Shift while moving or resizing to temporarily turn off snapping.

Improvements:

  • Expanded font selection from 7 to over 1,000.
  • Fonts load much faster.
  • All asset panel tabs now share a consistent layout.
  • Text rendering properly supports multiple lines, line height, and letter spacing.
  • Better contrast in the dark theme.

Fixes:

  • Fixed undo/redo for drag-and-drop so dropped items are reliably undoable.
0.0.1-beta2026-06-18

v0.0.1-beta: DaVinci-grade colour tools, Inspector refactor, freehand polish

First public beta. The Advanced colour card is now at parity with DaVinci Resolve + Kdenlive (Lift/Gamma/Gain/Offset wheels, Temperature/Tint, HSL Qualifier, Vignette, HSL Curves, live Scopes, .cube LUTs). The Inspector has been split into per-type primary tabs (Element / Text / Video / Image / Audio) and a new Image track type lets images sit on their own overlay lane. Freehand and Vector draw tools get a brushed-metal polish: live opacity, undo, Alight Motion-style 'Close path' / 'Delete last anchor' / Drawing Progress. 1,000+ asset library entries ship with the editor.

Features:

  • Advanced colour card (left rail → Adjust → Advanced) with eight facets, matched against the DaVinci Resolve + Kdenlive colour pipelines: Wheels (Lift / Gamma / Gain / Offset + 11 primary bars + Temperature / Tint / Y-only master), HSL (master + 8 per-band sliders), Qualifier (HSL channel toggles + Range / Softness + triple-handle Luma range bar), Vignette (Offset / Softness / Roundness + per-zone amount with live SVG shape preview), HSL Curves (seven HSL qualifier pairs: Hue vs Sat, Hue vs Lum, Hue vs Hue, Sat vs Sat, Sat vs Lum, Lum vs Sat, Lum vs Hue), Curves (Master / R / G / B tone curves), Scopes (live Waveform / Vectorscope with 75 % colour-bar targets / RGB Parade sampled at ~12 fps from the live preview canvas, with Freeze for A/B), and LUT (.cube import + intensity). All values are keyframable and write to the same davinci-adjust, hsl, curves, hsl-curve, or lut effect on the selected element.
  • Inspector primary tab bar now scopes each tab's secondary ids to a specific element type. The shared transform / effects / animations / masks ids no longer light up both the Video and Image primaries at once — when an image is selected only the Image primary stays highlighted, the Video primary is locked (with a tooltip explaining why). Element / Text / Audio primaries keep their single-id scopes. A new Image track type lets images sit on their own overlay lane instead of crowding the main video track, plus an 'Add image track' option in the timeline toolbar.
  • Mini audio-visualizer button in the preview toolbar now always animates. When audio is playing the bars drive off the live analyser data (same rAF tick as the large panel). When idle the bars pulse via a CSS keyframe (each bar offset by 0.18 s so they read as a left-to-right wave) so the button is visibly 'live' even before you press play. Container is 20 px tall with a 3 px min-height so the bars are always at least visible.
  • Freehand draw and Vector draw tools ship a full Opacity slider (0–100 % + 25/50/75/100 % presets), Undo button in the panel header, Alight Motion-style 'Close path' / 'Delete last anchor' actions, and a 'Drawing Progress' section (start / end percentages, keyframable for classic draw-on animation). Undo button mirrors Cmd/Ctrl+Z and is safe to spam — empty history is a no-op.
  • 1,000+ curated library entries ship with the editor: 165 effects across 13 categories, 162 transitions across 5 categories, 161 overlays across 5 categories, 150 motion presets, 320 templates, 180 stickers, 44 text presets + 77 text-animation presets, 75+ shape primitives, 1,000+ Google Fonts, and 28 marker sets. Procedural preview sources (gradient, checkerboard, SMPTE color bars, radial, diagonal stripes, portrait silhouette, noise field) are picked per-asset via a deterministic hash so blur/pixelate previews against checkerboards, color grading against color bars, vignette/glow against a radial burst, and grain/noise against a noise field.

Improvements:

  • Inspector primary tab bar fills the full row edge-to-edge (no left/right padding), shares the width equally between tabs, and locks the wrong-type tab (e.g. Video locks when an image is selected, Image locks when a video is selected) with a 'not available for the selected element' tooltip. The long tab names ('Speed Ramp', 'Adjust', 'Speed Ramp') no longer truncate.
  • AdjustmentsView (left rail card) was polished: replaced the chip row with a two-tab strip ('Adjustments' preset grid vs 'Advanced' colour card) so the colour tools live next to the preset browser instead of fighting the right inspector for the same role. Sub-tab pill row scrolls with a mask gradient on overflow, scrollbar hidden, active state uses white text on dark instead of the legacy cyan accent.
  • Text tab 'Content' textarea now auto-grows with the content. A long paste is auto-sized to fit (capped at 280 px so a giant paste doesn't push the rest of the inspector offscreen) and scrolls internally past that point. resize-none is removed so the user can no longer accidentally drag a tiny corner handle and lose content.
  • Inspector Element tab wraps long element names (the <p> showing the display name) with break-words so a 200-character text element doesn't overflow the panel's right edge. Same fix for the long ID / Group SummaryRow values — they wrap to multiple lines instead of being silently truncated.
  • Preview canvas register their DOM ref + current size with a global preview-canvas-scope handle, so the new Scopes sub-tab in the Advanced card can read live pixels from the rendered preview (downsampled to 96×64 for cheap getImageData calls at ~12 fps). The handle tears down on unmount so scopes show the empty silhouette when the preview isn't mounted (e.g. in a fullscreen pop-out).
  • AdjustmentsView and Effects/Transitions/Overlays/Plugins cards share a polished chrome — same PopOut button, same PanelView title bar, same empty-state copy ('Select a video or image…' / 'Multiple layers selected…' / 'Pick a video or image…'). Color grading presets (Grayscale, Sepia, Vintage, HSL, Duotone, Cyberpunk, Noir, Amber Grade, etc.) are exclusive to the Adjustments panel under the 'Color' category.

Fixes:

  • Inspector primary tab bar no longer collapses to a single tab when you're inside a focus category (Effect / Animation / Adjust*). The top bar stays full so Video / Audio / Text / Element stay reachable. The secondary row (transform / audio / speed chips) also stays visible — both rows are now always shown, so the user never loses access to 'Transform' or 'Opacity' just because they were tweaking an effect.
  • Long preset names no longer truncate — every asset card uses MarqueeText for its label, so a 60-character effect name scrolls in place instead of cutting off with an ellipsis. Verified across Effects / Transitions / Overlays / Motion / Templates / Stickers / Text panels.
  • Audio Effects → Noise Reduction Strength field is now wired to state (was hardcoded 50 with no-op onChange/onFocus/onBlur/onScrub handlers). Scrubbing the slider, typing a number, and pressing the reset button all update the actual noise reduction state and the engine that consumes it.
  • Freehand strokes no longer snap to the canvas center on release — the path lands exactly where the user drew it. Centring the simplified path inside the 512×512 source space before committing fixes the visual jump without changing the final position.
  • Text element Text tab no longer shows the generic Element tab. Text now goes straight to the Text tab (Content / Style / Animate / Typography / Spacing / Background / Effects) with the customizer the user wanted, no mixed metadata.
  • Inspector Audio Fade In/Out fields now stack on panels narrower than 420 px so the second field no longer clips the digit. Volume and pan sliders update the live audio mix immediately — no more silent gaps or playback restarts when scrubbing the dB/pan controls.
Technical details:
  • AI providers storage lives in localStorage and persists across sessions. POST /api/ai/test sends a 1-token probe and returns actionable errors: 401 → 'Check the API key', 404 → 'Check the base URL and model name', 429 → 'try again shortly', network drop → 'Could not reach the server'.
  • AudioVisualizer's rAF loop now allocates a single Uint8Array(frequencyBinCount) once on mount and reuses it across frames — analyser.frequencyBinCount is stable for the lifetime of the AudioContext. Removes ~60 allocations/second of GC pressure.
  • EditorFooter's per-second 'Worked on HH:MM:SS' counter now updates via direct DOM mutation (ref + setInterval) instead of setState — the surrounding fps/aspect/canvas-size chrome no longer reconciles once a second just because the clock text changed. Pop-out window close-polling dropped from requestAnimationFrame to setInterval + pagehide listener on the opener. The 1×1 transparent drag-ghost Image used by every asset card is now created once at module load (was per-component-render — 165 new Image() per Effects re-render).