Skip to content

v1.11.0-rc.1

Pre-release
Pre-release

Choose a tag to compare

@EtienneLescot EtienneLescot released this 08 Sep 07:24

Changes since v1.10.0

  • docs(testing): say who runs the manual e2e pass, and that a slice counts
  • docs(testing): keep the promote gate at the whole file
  • fix(timeline): remove the dead Add Full Camera toolbar button
  • fix(editor): remove the redundant top-bar settings button
  • fix(editor): close the clip picker on an outside click
  • fix(stt): offer every whisper.cpp language in the regenerate picker
  • fix(stt): wire the language list into the picker that's actually live
  • fix(stt): validate regenLang against the known code list
  • Revert "fix(timeline): remove the dead Add Full Camera toolbar button"
  • fix(editor): make the gradient picker and a couple of dialogs follow the light theme
  • fix(editor): a subagent review of the previous commit's own diff, addressed
  • fix(editor): zoom/pan the whole timeline pane on scroll, not just the lanes
  • test(editor): cover Shift+wheel pan from the ruler too
  • fix(captions): position presets you can click, sliders that reach the true edge
  • docs(captions): describe the position-preset derivation, fix a drifted anchor
  • fix(captions): pick the closest position preset, not the first one checked
  • fix(editor): give the timeline clip's delete icon the same dark-chip treatment as its label
  • feat(compositor): let a text region pin an edge instead of centring its block
  • fix(captions): place captions by anchor and margin, not by an invisible band
  • feat(captions): draw the anchor line and the column while the pane is open
  • test(compositor): anchor on the line box, not on the last pixel of ink
  • fix(captions): reserve the plate's margin on the anchored side, and migrate insetX
  • fix(compositor): a doc comment cannot sit on a function parameter
  • fix(captions): let the first write know the output aspect too
  • revert(captions): drop the preview guide, it had nothing left to explain
  • fix(captions): default the insets to what actually sits well with the padding
  • docs(testing): log the v1.10.0-rc.3 Windows e2e run
  • docs(testing): correct the rc.3 row - pause works, the verdict was wrong
  • docs(testing): correct the rc.3 row again - STT works, the message lies
  • docs(testing): retract the Escape finding - the driver ate the key
  • docs(testing): close the caption gap on the rc.3 row
  • fix: initialise CoreGraphics before building a window capture filter
  • docs: name the MP4 as the recording, not a sidecar, in the results row
  • refactor(macos-capture): name the CoreGraphics init call, cross-reference the other one
  • fix(recording): use hardware H.264 on Windows by default, not just when asked
  • fix(app): reach Save Diagnostics from the menu and tray, not nowhere
  • fix(app): address CodeRabbit review on the Save Diagnostics PR
  • fix(recording): stop burning the step budget on a join that cannot succeed
  • docs: publish minimum and recommended system requirements
  • docs: address CodeRabbit review on the system requirements PR
  • fix(website): match the recreation generator's param name to ClipWaveform's amplitude rename
  • fix(ci): don't let the docs refresh block Microsoft Store publishing
  • chore: bump nix package to v1.10.0
  • fix(build): stop the Windows cargo env values from breaking Linux builds
  • fix(build): require lib/ as well as include/ when picking an ffmpeg tree
  • fix(build): accept a LIBCLANG_PATH that names a library file, and skip libclang-cpp
  • fix(build): match clang-sys's exact libclang filename patterns
  • fix(build): only accept a LIBCLANG_PATH entry that is a regular file
  • refactor(editor): delete the orphaned v3 left rail and media pane
  • docs(editor-shell): fix the stale ChatStripPanel mount line reference
  • docs(schema): drop the stale SourceTranscriptModal note from the language table
  • fix(editor): finish the v3 rail removal — dead CSS, stale refs, unused import
  • docs(editor): stop citing the deleted Source Transcript modal
  • feat(capture): negotiate tiled dmabuf and plumb the GPU descriptor (#507)
  • feat(capture): add the dmabuf -> VAAPI importer module (#507)
  • feat(capture): wire the dmabuf importer through to the encoder (#507)
  • fix(capture): make the dmabuf VAAPI import work on radeonsi (#507)
  • feat(capture): auto-enable dmabuf import with shm fallback (#507)
  • feat(capture): crop window captures on the GPU in the VPP (#507)
  • fix(capture): address CodeRabbit review on #508
  • fix(capture): invalidate held dmabuf buffers on remove (CodeRabbit #508)
  • fix(capture): generation-tag held dmabuf buffers against slot reuse (CodeRabbit #508)
  • fix(capture): null-check hw buffer inputs, add libglvnd to the rpath
  • fix(capture): gate the dmabuf offer on the forced encoder, and allow a render-node override
  • fix(capture): panic-safety, stale hw surface, and a non-fatal dmabuf drop
  • refactor(capture): dedupe DmabufPlane, cover the fourcc map, fix a vendor comment
  • fix(capture): decline an untracked dmabuf buffer instead of leaking it
  • fix(capture): own the dmabuf plane fds so a destroyed buffer can't corrupt an import
  • fix(capture): fail loudly when dmabuf import never works, not silently empty
  • feat(linux): capture mouse clicks on Wayland via evdev
  • fix(linux): gate evdev readers on cursor mode, and document the input group
  • fix(cursor): enable click-bounce effect on Linux now that evdev captures clicks
  • fix(linux): ignore clicks until the stream is live, dropping the portal "Share" press
  • docs(linux): note that touchpad tap-to-click is not captured
  • fix(linux): harden the evdev click reader (EINTR, hotplug, device loss, double-click)
  • fix(linux): address CodeRabbit re-review of the click-capture path
  • fix(macos): drop the native deployment floor to macOS 12
  • fix(recording): stop reporting an unrunnable helper as a denied permission
  • test(macos): pin the helper-unavailable taxonomy and the deployment floor
  • fix(recording): address CodeRabbit review on #527
  • fix(macos): declare macOS 13 as the floor instead of accommodating 12
  • test(macos): stop the app-floor parser being fooled by prose
  • refactor(scripts): give the app-floor parser one home
  • fix(build): pin the macOS deployment target for ffmpeg and whisper
  • feat(build): refuse to pack a macOS binary built above the supported floor
  • fix(build): retarget the macOS floor to 13, matching the declared support
  • test(build): read the declared floor through the shared parser
  • fix(build): stop the floor guard advising a version it would reject
  • docs(linux): align the two guides on what Linux actually captures
  • feat(webcam): add AI background cutout, blur, and custom wallpapers (#291)
  • fix(ci): update npmDepsHash in nix package and fix TypeScript types in ExportDialog and webcamSegmentation
  • fix(nix): update npmDepsHash to match package-lock.json
  • fix(webcam): address the review findings on the AI background PR
  • docs(webcam): record where segmentation stands and what has to be measured
  • docs(webcam): the workload is overhead-bound, so quantisation is the wrong lever
  • docs(webcam): E0 falsifies the overhead-bound reading — it is bandwidth-bound
  • docs(webcam): round 3 brief — settle the execution provider
  • docs(webcam): settle on the CPU execution provider
  • feat(webcam): composite the segmentation mask in the shader
  • feat(webcam): vendor the ONNX segmentation model and its conversion script
  • feat(webcam): load the segmentation model and produce the mask
  • feat(webcam): extract the webcam frame and drive inference at 30 Hz
  • feat(webcam): drive segmentation from compose_frame
  • feat(webcam): start segmentation from the scene, and prove it on the bench
  • feat(webcam): port the mask composite to Metal and WGSL
  • feat(webcam): move segmentation into the compositor and delete the renderer path
  • fix(webcam): hide the background control where it cannot work
  • fix(webcam): a missing ONNX Runtime must not take the render thread down
  • docs(webcam): brief for porting segmentation to a compositor back-end
  • docs(webcam): add the per-back-end specifics to the port brief
  • feat(webcam): port segmentation to the Metal back-end
  • test(webcam): a visual harness for the mask, and what it cost to run
  • build(webcam): stage ONNX Runtime, so the segmentation effect can actually run
  • feat(webcam): port segmentation to the Linux compositor back-end
  • build(webcam): ship ONNX Runtime on Linux, now that its back-end can use it
  • fix(webcam): the three blockers that left the camera background non-functional
  • fix(webcam): make the exported mask reproducible
  • docs(webcam): close out the review threads on the measurement record
  • fix(compositor): bound the image texture cache, which never freed anything
  • fix(compositor): the frame marker protected one entry too many
  • fix(webcam): ask the machine whether it can segment, instead of guessing
  • fix(build): the ONNX requirement must not apply to Intel Macs
  • perf(wallpapers): cap the bundled backgrounds at 3840px
  • perf(audio): stretch speed regions through libavfilter atempo instead of WSOLA
  • fix(audio): guard the decode and WSOLA loops against pathological stalls
  • fix(review): address CodeRabbit findings on the atempo PR
  • fix(review): address OpenScreen#371 blocking review (EtienneLescot)
  • fix(packaging): CodeRabbit follow-up on #371 — require all six ffmpeg libs, guard --sdk-only
  • fix(nix): stage and rename libavfilter for the compositor addon
  • docs: describe the atempo stretch path and the six-library ffmpeg set
  • perf(audio): make the atempo stretch land on the target without a hole
  • fix(nix): refresh npmDepsHash, and format the new packaging test
  • fix(audio): cap the atempo chain instead of stacking stages without a bound
  • fix(nix): unbreak nix build, and let it run on the PRs that can break it
  • fix(nix): trigger on this workflow's own edits, and narrow an overclaim
  • ci(nix): prove the addon by exporting a synthesised clip, not by recording
  • fix(export): keep the progress bar honest and moving during the audio phase
  • fix(export): join the audio jobs on the error path, and state their real bound
  • fix(preview): show the modifiers under a trim when the playhead is on it
  • test(preview): cover the annotation and Full Camera under-trim payloads
  • feat(website): add a development journal at /blog
  • docs(website): tag the pipeline fence and hyphenate end-to-end
  • feat(website): route all Discord links through getopenscreen.com/discord
  • perf(compositor): convert the composed frame to YUV on the GPU (Linux)
  • perf(export): feed the encoder the GPU-converted planes (Linux)
  • chore: add FUNDING.yml
  • docs: link GitHub Sponsors from the README
  • chore: add Ko-fi to the funding options
  • docs: add a Sponsor badge to the README header
  • perf(export): encode on its own thread, so the walk does not wait for it (Linux)
  • perf(compositor): upload the decoder's three planes, instead of interleaving to NV12 (Linux)
  • perf(export): give the pool frames the GPU's own strides (Linux)
  • fix(export): a panicking encode worker deadlocked the walk thread (Linux)
  • docs(export): make the ectx comment state the rule it is guarding
  • feat(gpu): open the Vulkan device with the external-memory extensions (Linux)
  • feat(compositor): teach the YUV pass to emit NV12 as well as I420 (Linux)
  • fix(gpu): stop requiring the DRM modifier extension for dmabuf export (Linux)
  • feat(compositor): a staging buffer whose memory can be exported as a dmabuf (Linux)
  • feat(export): encode from an exported dmabuf with h264_vaapi (Linux)
  • feat(compositor): compose straight into exportable dmabuf memory (Linux)
  • feat(export): encode on the GPU when VAAPI is available (Linux)
  • fix(export): let OPENSCREEN_EXPORT_ENCODER gate the hardware path too (Linux)
  • perf(export): overlap the GPU compose with the hardware encode (Linux)
  • fix(gpu): require coherent memory, and stop assuming queue family 0 is graphics
  • fix(export): stop reading past odd-sized planes, and put SPS/PPS in the extradata
  • fix(export): do not reuse memory the encoder is still reading (Linux)
  • refactor(export): one layout, one encoder, and give the ring its depth back
  • chore: document the supported funding platforms
  • fix(export): give the Linux encoder a keyframe interval and a chosen QP window
  • fix(export): derive the VAAPI keyframe interval from the fps, like the software path
  • fix(build): stop hiding the shared dependencies behind cfg(linux)
  • chore(ffmpeg): say that the encoder list is reported, not verified
  • refactor(export): drop send_rgba and the state that existed only for it (Linux)
  • fix: reset themed cursor when sidecar type is null or omitted
  • test: pin English locale in Cursor pane preview
  • test: prove omitted cursorType reset independently
  • feat(update): add update settings and a background check
  • fix(update): stop non-downloaded outcomes short of the restart prompt
  • feat(editor): persist and restore the editor window bounds
  • fix(editor): reject zero-size and non-boolean window state instead of restoring it
  • fix(stt): distinguish initializing from transcribing on every spinner
  • fix(stt): keep busy labels timeline-scoped and visible during regeneration
  • feat(editor): crop at pixel resolution with a larger preview
  • fix(editor): keep crop fields editable mid-entry and reset stale clip metadata
  • fix: snap illegal AAC sample rates to 48 kHz on Windows
  • fix: anti-alias AAC downsample and ungate native build from MF probes
  • fix: keep sub-factor AAC packets on the interpolation path
  • fix: carry AAC downsample remainder across packets
  • chore(i18n): drop the transcribingEllipsis key orphaned by the MediaStage change
  • feat(export): time each stage of an export behind an env var
  • perf(export): decode H.264 in software on the macOS export walk
  • perf(export): measure 4K decode too, and close the profiling gap on the software encoder
  • docs(testing): cover what landed after v1.10.0, and log the Windows run
  • fix(packaging): stage the CRT beside onnxruntime, unblocking the Windows build
  • docs(testing): make the export-audio checks say what they can actually prove
  • docs: add Trendshift developer badge to README
  • docs: remove personal Trendshift developer badge from README
  • docs(perf): record the macOS export measurements, including what failed
  • docs(perf): fix the macOS section's anchor, code fence and energy claim
  • docs(perf): capping the macOS decoder's threads is a loss, and why the fixture said otherwise
  • docs(perf): stop overstating the thread result, and stop guessing the thread count
  • ci(onnx): build ONNX Runtime for macOS with the floor the app declares
  • ci(onnx): stage the LICENSE, and build a cache key that is not empty
  • ci(onnx): attest the build's provenance, so the digest is not the only claim
  • ci(onnx): bound the build, stop piling up runs, and pin every action
  • ci(onnx): build a pinned commit, not a movable tag, and drop the token
  • fix(onnx): give SOURCE_COMMIT a use, instead of a lint suppression
  • ci(build): do not run the release matrix for internal v0.0.0-* tags
  • fix(wgc): pull-based frame delivery to stop CopyResource wedging the stop path
  • fix(wgc): address CodeRabbit review on the pull-based frame delivery PR
  • fix(wgc): register onFrameArrived's in-flight guard before touching the frame pool
  • fix(wgc): return before touching the frame pool when the legacy callback is null
  • test(wgc): run the #460 stall scenario on the path that still has a callback
  • fix(macos): serve ONNX Runtime from a build that respects the 13.0 floor
  • docs(perf): settle the macOS export's 4 s cold start, and kill the asar lever
  • docs(perf): keep the cold-start conclusions at the evidence level
  • docs(perf): stop the cold-start section excluding more than it measured
  • fix(ci): read the runner image instead of interpolating an empty string
  • feat(editor): add audio-track data model for external audio import
  • feat(editor): import external audio files as audio-kind assets
  • feat(editor): add timeline state ops for imported audio tracks
  • feat(editor): import audio onto the timeline with a lane and inspector
  • feat(editor): drag and trim audio tracks on the timeline lane
  • feat(editor): play imported audio tracks in the preview
  • feat(export): mix imported audio tracks into the exported MP4
  • feat(editor): fold audio import into the single "Import media" button
  • fix(editor): smooth audio-track preview and stop audio becoming a clip
  • feat(editor): add audio from the timeline toolbar, not the media tab
  • refine(editor): tidy the audio toolbar button and inspector pane
  • refine(editor): reposition Add audio and make Delete track span
  • refine(editor): match the audio-track pane to the global Audio pane
  • refactor(editor): drop the superseded audio-track move/resize ops
  • refactor(editor): remove the mute feature from imported audio tracks
  • docs: list audioTracks[] in the document-model top-level shape
  • fix(editor): address CodeRabbit review on the audio-import PR (#502)
  • feat(editor): honor imported-track boost in the preview (CodeRabbit #5)
  • feat(editor): always show the audio lane + an "Add audio" shortcut (M)
  • fix(editor): sync imported audio tracks to trims in the export (issue #350)
  • fix(editor): address CodeRabbit follow-up on the audio-track PR (#502)
  • docs(editor): correct the timelineStartSec comments — the head is raw, not output
  • fix(editor): play imported audio contiguously in preview to match the export
  • fix(ipc): accept audio paths in the generic media reads so imported waveforms survive a reopen
  • fix(editor): three more preview↔export audio seam bugs
  • fix(editor): four imported-audio state leaks
  • refactor(editor): three imported-audio cleanups
  • feat(audio): clip-anchor timeline audio tracks
  • feat(audio): fades, loop and mute on timeline audio tracks
  • feat(audio): record voiceovers against the timeline
  • fix(audio): unblock voiceover recording and restore the left-edge trim
  • fix(audio): make the loop toggle reachable, and give voiceover a button
  • test(timeline): pin the voiceover toolbar button
  • feat(audio): make loop fill by itself, and mark where it repeats
  • feat(timeline): one audio button with a named menu, and real tooltips
  • fix(ui): forward refs through the Popover and Tooltip wrappers
  • feat(timeline): stack overlapping audio tracks on their own rows
  • fix(audio): silence the timeline's own tracks while recording a take
  • feat(audio): dock the voiceover recorder instead of covering the video
  • fix(audio): stop tracks inside a trimmed stretch from playing
  • fix(audio): keep tracks at 1x and in place under speed regions
  • perf(transcription): extract audio natively, off the UI thread
  • fix(timeline): let the keyboard activate a lane pill, not just the pointer
  • fix(transcription): stop the background pass transcribing music
  • feat(ai): let the agent see and place audio tracks
  • feat(timeline): show what an audio pill crops, and let it slip
  • fix(timeline): say that Alt slips, instead of leaving it to be discovered
  • fix(timeline): put the slip gesture where it is read without hovering
  • feat(editor): fold captions into the transcript tab
  • feat(editor): read the transcript from the voiceover, not just the film
  • feat(document): add immutable transcript word edits
  • fix(document): validate referenced word ownership and join CJK independently of language tag
  • fix(document): read CJK segment edges by code point for non-BMP Han
  • feat(document): make a corrected word survive its re-transcription
  • feat(editor): correct a word in the transcript without cutting the film
  • feat(editor): add words to the transcript that nobody said
  • feat(editor): an added word buys itself time, and the film holds its frame
  • revert(editor): an added word no longer splits the clip it lands in
  • feat(timeline): mark where words were added, without storing anything new
  • feat(ai): let the chat correct a word it heard wrong
  • feat(document): store the pause an added word needs, as a region
  • feat(editor): the readers count the pause an added word bought
  • feat(timeline): one answer to whether a raw moment is in the film
  • feat(editor): decide a word by the ruler, so both lanes agree
  • feat(audio): a cut under a voiceover takes the words, not the take's tail
  • feat(editor): a transcript cut names a moment, not an owner
  • feat(captions): the lane is a document fact, and the captions follow it
  • feat(audio): one voiceover row, one music row, through a single door
  • fix(document): sweep the trims that struck words through without cutting
  • feat(timeline): tell the two insertion lanes apart, and pin the inert one
  • feat(timeline): one walk over a take, losing time to a cut and gaining it to a word
  • fix(timeline): the projection counts the pauses, so audio stops landing early
  • fix(export): a pause reaches the compositor, instead of exporting as nothing
  • feat(audio): the export and the transcript read the take's walk
  • feat(preview): the voice parks with the walk, and every take plays once
  • feat(editor): add a word on either lane, and draw the time it buys
  • feat(editor): cut the notch into the take, inside one outline
  • fix(timeline): a scrub names a moment on the ruler, not on the tape
  • fix(preview): the picture spends the pause a word bought
  • fix(preview): an insertion is media that plays, not a pause
  • fix(preview): park the picture on the insertion, don't re-seek it
  • fix(timeline): the scrub release carries its ruler second too
  • refactor(timeline): one clock — an insertion is media, so the clip is longer
  • fix(captions): place a cue past an insertion on the source it names
  • fix(document): reconcile clip geometry with the insertions on every load
  • fix(captions): an added word is subtitled over the media it inserted
  • fix(timeline): the insertions are a required argument, and the compiler found the rest
  • fix(transcript): the pane follows the voice across an insertion, and highlights the added word
  • fix(captions): an added word and the word after it share a second — order them on the ruler
  • refactor(timeline): delete the duplicate answer, route the rest through the one mapping
  • revert(insertions): remove the added-word machinery, keep the gesture
  • feat(media): generate the media an added word is spoken over
  • feat(timeline): the insertion layer — a clip reads a list of parts, not a file
  • feat(timeline): the one funnel reads parts, so an extension is a segment like any other
  • feat(document): the clip grows with the word, at the one funnel every write goes through
  • feat(media): an extension resolves to a file, and the save generates it
  • feat(preview): the DOM preview plays an extension, because it is handed a clip
  • fix(transcript): the conversion source second -> ruler second lives in one place
  • fix(insertions): an extension is a clip, because that is the only shape the app maps
  • feat(insertions): an insertion is a clip, stored as one
  • refactor(timeline): the seam a clip leaves closes only under generated media
  • refactor(timeline): two clips whose media continues across the join are one clip
  • fix(insertions): editing an insertion's text resizes the clip it plays
  • test(insertions): shortening an insertion is a second claim, pinned separately
  • feat(insertions): an insertion in a voice-over is a track fragment
  • refactor(voiceover): the take walk is a subtraction again
  • fix(insertions): a release build cannot retype an inserted word either
  • docs(insertions): the gate is the runtime refusal, not the dead-code elimination
  • refactor(insertions): one flag for the dev gate, read where the gesture happens
  • fix(ai): the chat cannot rewrite a word nobody said
  • fix: the six CodeRabbit findings that were still standing and cheap
  • fix: the four CodeRabbit findings that were left, including the read capability
  • fix(rebase): restore what replaying 112 commits dropped
  • docs(e2e): checks for imported audio, voice-over and word insertion
  • build: pin electron exactly, so packaging works without a second declaration
  • fix(insertions): the deleted word stayed in the transcript
  • test(insertions): control tests that control something
  • fix(i18n): simplify transcript panel title across all locales
  • fix(website): derive trimId from clipWord.trimIds in gen-recreation
  • fix(editor): reset all parameters on audio track pane reset
  • test(editor): verify audio track live drafts are cleared on reset
  • fix(editor): prevent audio track slider jump on release
  • fix(editor): polish UI layout, slider gauge, icons and captions panel
  • fix(timeline): expand initial timeline height and dynamically adjust for stacked audio lanes
  • test(timeline): cover overlapping same-kind audio tracks
  • fix(editor): keep the camera preset labels inside their button
  • fix(compositor): high-quality motion blur and gaussian webcam blur
  • fix(compositor): bound cursor motion blur trail_dt to at most 1 frame
  • fix(compositor): show the webcam background effects on click, not on the next scrub
  • fix(compositor): open the settle window after a paused seek too
  • fix(editor): keep the top bar usable when the window gets narrow
  • fix(build): ship the ffmpeg CLI in the macOS .app so transcription works without a system ffmpeg
  • fix(build): address review comments and format before-pack.cjs
  • fix(build): harden macOS ffmpeg dylib staging
  • chore: name @Beetix code owner for Linux/Wayland capture

Full Changelog: v1.10.0...v1.11.0-rc.1