chore: add brand marks, changelogs, and logo upload

This commit is contained in:
Maze Winther 2026-07-22 16:45:29 +02:00
parent ed572093e9
commit ce5d396856
11 changed files with 309 additions and 3 deletions

1
.env.example Normal file
View File

@ -0,0 +1 @@
R2_BUCKET=opencut-assets

View File

@ -1,6 +1,7 @@
$schema: 'https://moonrepo.dev/schemas/workspace.json'
# Discover all projects under apps/ automatically.
# When shared crates land under crates/, add a 'crates/*' glob here.
projects:
- 'apps/*'
globs:
- 'apps/*'
sources:
root: '.'

36
brand/marks/icon.svg Normal file
View File

@ -0,0 +1,36 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1_16)">
<mask id="mask0_1_16" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="512" height="512">
<path d="M392 0H120C53.7258 0 0 53.7258 0 120V392C0 458.274 53.7258 512 120 512H392C458.274 512 512 458.274 512 392V120C512 53.7258 458.274 0 392 0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1_16)">
<path d="M512 0H0V512H512V0Z" fill="#F4F1F3"/>
<path d="M512 0H0V512H512V0Z" fill="url(#paint0_radial_1_16)"/>
<path d="M512 0H0V512H512V0Z" fill="url(#paint1_radial_1_16)"/>
<path d="M512 0H0V512H512V0Z" fill="url(#paint2_radial_1_16)"/>
<path d="M512 0H0V512H512V0Z" fill="url(#paint3_radial_1_16)"/>
</g>
<path d="M404 193.993V317.007L317.007 404H193.993L107 317.007V193.993L193.993 107H317.007L404 193.993ZM181.25 181.25V329.75H329.75V181.25H181.25Z" fill="black"/>
</g>
<defs>
<radialGradient id="paint0_radial_1_16" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="scale(563.2)">
<stop stop-color="#4FFFFF"/>
<stop offset="1" stop-color="#6EE8E8" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint1_radial_1_16" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(512) scale(563.2)">
<stop stop-color="#F7E690"/>
<stop offset="1" stop-color="#F7E690" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint2_radial_1_16" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(0 512) scale(563.2)">
<stop stop-color="#B9C2F2"/>
<stop offset="1" stop-color="#B9C2F2" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint3_radial_1_16" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(512 512) scale(563.2)">
<stop stop-color="#FFBDDD"/>
<stop offset="1" stop-color="#F9C2DD" stop-opacity="0"/>
</radialGradient>
<clipPath id="clip0_1_16">
<rect width="512" height="512" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@ -0,0 +1,15 @@
<svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_16_39)">
<mask id="mask0_16_39" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="400" height="400">
<path d="M400 0H0V400H400V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_16_39)">
<path d="M400 117.163V282.838L282.838 400H117.163L0 282.838V117.163L117.163 0H282.838L400 117.163ZM100 100V300H300V100H100Z" fill="black"/>
</g>
</g>
<defs>
<clipPath id="clip0_16_39">
<rect width="400" height="400" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 605 B

View File

@ -0,0 +1,15 @@
<svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_16_30)">
<mask id="mask0_16_30" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="400" height="400">
<path d="M400 0H0V400H400V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_16_30)">
<path d="M400 117.163V282.838L282.838 400H117.163L0 282.838V117.163L117.163 0H282.838L400 117.163ZM100 100V300H300V100H100Z" fill="white"/>
</g>
</g>
<defs>
<clipPath id="clip0_16_30">
<rect width="400" height="400" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 605 B

37
changelog/0.1.0.md Normal file
View File

@ -0,0 +1,37 @@
---
version: "0.1.0"
date: "2026-02-23"
published: true
title: "Editor foundation"
description: "This first release focuses on making editing faster, clearer, and more reliable for day-to-day use."
summary: "Properties panel overhaul, 1,000+ fonts, blend modes, a new color picker, and direct manipulation in the preview."
changes:
- type: new
text: "Rebuilt the properties panel from scratch. Number inputs now support math expressions and click-drag scrubbing instead of just typing values in."
- type: new
text: "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."
- type: new
text: "New color picker with eyedropper, opacity control, and multiple color formats."
- type: new
text: "Bookmarks now support notes, color labels, and optional duration to plan scenes more clearly."
- type: new
text: "Move, scale, and rotate elements directly in the preview panel."
- type: new
text: "Blend modes (Multiply, Screen, Overlay, etc). Only available on text elements for now."
- type: new
text: "Paste images, videos, or audio from your clipboard straight into the editor."
- type: new
text: "Hold Shift while moving or resizing to temporarily turn off snapping."
- type: improved
text: "Expanded font selection from 7 to over 1,000."
- type: improved
text: "Fonts load much faster."
- type: improved
text: "All asset panel tabs now share a consistent layout."
- type: improved
text: "Text rendering properly supports multiple lines, line height, and letter spacing."
- type: improved
text: "Better contrast in the dark theme."
- type: fixed
text: "Fixed undo/redo for drag-and-drop so dropped items are reliably undoable."
---

47
changelog/0.2.0.md Normal file
View File

@ -0,0 +1,47 @@
---
version: "0.2.0"
date: "2026-03-01"
published: true
title: "Motion & effects"
description: "This release adds the foundation for motion and effects, alongside many improvements & fixes."
summary: "Keyframe animation, a new effects system with per-clip blur, and ripple editing mode."
changes:
- type: new
text: "Keyframe animation system for animating element properties over time."
- type: new
text: "Entirely new efects system. Effects can be applied per-clip or added as standalone elements on the timeline (with our first effect: Blur!)"
- type: new
text: "Added a changelog page to the site."
- type: new
text: "Ripple editing mode."
- type: fixed
text: "Fixed an issue where click-and-drag selection on one timeline track could accidentally select items from the track below."
- type: fixed
text: "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."
- type: fixed
text: "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."
- type: fixed
text: "A few values in the properties panel were previously showing incorrect values. This has been fixed."
- type: improved
text: "New text elements no longer have a black background by default."
- type: improved
text: "Selection outline in the preview is now dashed."
- type: improved
text: "Clips sitting next to each other on the timeline now have a small gap between them so selected clips are always clearly visible."
- type: fixed
text: "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."
- type: fixed
text: "Clips being dragged on the timeline now render on top of other clips instead of underneath them."
- type: fixed
text: "Undoing a trim-from-start operation now correctly restores the clip to its original position and length, instead of stretching it to the right."
- type: fixed
text: "Resizing a clip on the timeline would deselect it when the mouse was released. The clip now stays selected after a resize."
- type: improved
text: "Press Escape to deselect the current element."
- type: fixed
text: "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."
- type: fixed
text: "Dragging a clip to a different track would deselect it on drop. The clip stays selected after moving."
- type: fixed
text: "Finishing a resize or drag with the mouse over empty track space would deselect the clip."
---

114
changelog/0.3.0.md Normal file
View File

@ -0,0 +1,114 @@
---
version: "0.3.0"
date: "2026-04-15"
published: true
title: "Masks, animation & more"
description: "This release adds masks, a graph editor for keyframe curves, volume and speed controls, preview zoom, canvas backgrounds, stickers, and a lot more."
summary: "Masks, graph editor for curves, volume & speed controls, preview zoom, canvas backgrounds, and stickers."
changes:
- type: new
text: "Added a brand page with downloadable brand assets. Assets are also accessible directly from the header logo context menu."
- type: fixed
text: "Sponsor logos now correctly invert in dark mode."
- type: improved
text: "Added a changelog link to the footer."
- type: fixed
text: "Media asset cards in the grid view were larger than their thumbnails, leaving empty space around each item. Cards now size to their content."
- type: improved
text: "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."
- type: fixed
text: "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."
- type: fixed
text: "Clicking a selected element no longer keeps the rest of the selection."
- type: improved
text: "More vertical space between timeline tracks. Selection outlines on adjacent tracks no longer overlap each other."
- type: fixed
text: "Track labels on the left side of the timeline were misaligned with the tracks on the right."
- type: improved
text: "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."
- type: improved
text: "Timeline track rows now highlight when they contain a selected element, making it easier to see which tracks are active at a glance."
- type: fixed
text: "Clicking in the empty space below timeline tracks now seeks the playhead."
- type: fixed
text: "Timeline vertical scroll now works anywhere in the panel, not just over the track labels. The header no longer scrolls with the tracks."
- type: new
text: "Scale now has separate width and height controls. You can stretch or squash elements independently on each axis."
- type: improved
text: "System fonts (Arial, Helvetica, Times New Roman, and others) now appear in the font picker alongside Google Fonts."
- type: fixed
text: "MP4 exports with audio failed on Firefox. The export now completes successfully regardless of browser."
- type: improved
text: "Your projects can disappear if your disk runs low on space. OpenCut now asks the browser to protect them."
- type: improved
text: "The properties panel has been redesigned with a tabbed layout."
- type: new
text: "Volume control for audio and video elements."
- type: new
text: "Speed control for video and audio clips. Includes a maintain pitch option so audio doesn't chipmunk or deepen when you change the rate."
- type: improved
text: "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."
- type: improved
text: "The timeline now opens scrolled to the bottom, so your main video track is visible right away instead of being hidden above the fold."
- type: fixed
text: "Snap guides in the preview panel didn't show when moving a full-canvas element to the center of the frame."
- type: fixed
text: "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."
- type: fixed
text: "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."
- type: fixed
text: "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."
- type: new
text: "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."
- type: improved
text: "The settings panel has been redesigned with a cleaner layout and better organization."
- type: new
text: "Canvas backgrounds are back. Set a blur, solid color, or gradient as the canvas background from the new Background tab in the settings panel."
- type: fixed
text: "Blur looked pixelated at higher intensities instead of producing a real blur. Both the canvas background blur and the blur effect are now fixed."
- type: new
text: "Custom canvas size. Instead of being locked to a handful of presets, you can now enter any width and height you want."
- type: new
text: "Preview zoom and panning. Zoom into the canvas to work on fine details, and pan around to navigate when zoomed in."
- type: new
text: "Stickers panel now has content. Browse and add country flags and shapes."
- type: improved
text: "You can now select multiple assets in the assets panel. Useful for deleting several at once."
- type: fixed
text: "Auto-generated captions were sometimes inaccurate. The underlying issue has been fixed."
- type: new
text: "You can now import transcript files to generate captions instead of running auto-transcription."
- type: new
text: "Graph editor for keyframe curves. Shape the easing between keyframes by dragging bezier handles."
- type: fixed
text: "Text element handles no longer shift position as you type."
- type: new
text: "Multiple selected timeline clips move and resize together."
- type: fixed
text: "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."
- type: new
text: "Position X and Y can now be animated independently."
- type: new
text: "Keyframes can be copied and pasted between elements."
- type: new
text: '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.'
- type: improved
text: "If your browser doesn't support GPU-accelerated rendering, the editor now shows a notice explaining why and suggests switching to another browser."
- type: technical
text: "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."
- type: technical
text: "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."
- type: technical
text: "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."
- type: technical
text: "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."
- type: technical
text: "`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/`."
- type: technical
text: "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."
- type: technical
text: "`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."
- type: technical
text: "16 new storage migration steps were added (v9 through v25), covering the schema changes accumulated during this release cycle."
---

32
moon.yml Normal file
View File

@ -0,0 +1,32 @@
$schema: 'https://moonrepo.dev/schemas/project.json'
tasks:
upload-logos:
script: |
set -eu
root="$(pwd)"
if [ ! -f "$root/.env.local" ]; then
echo 'Missing .env.local. Copy .env.example to .env.local first.' >&2
exit 1
fi
set -a
. "$root/.env.local"
set +a
: "${R2_BUCKET:?Set R2_BUCKET in .env.local}"
for file in "$root"/brand/marks/*.svg; do
bun run --cwd apps/web wrangler r2 object put \
"$R2_BUCKET/branding/${file##*/}" \
--file "$file" \
--content-type 'image/svg+xml' \
--remote
done
inputs:
- 'brand/marks/*.svg'
- 'apps/web/package.json'
- '.env.example'
options:
cache: false
runInCI: false