v1.11.0-rc.1
Pre-release
Pre-release
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