Skip to content

v1.10.0-rc.1

Pre-release
Pre-release

Choose a tag to compare

@EtienneLescot EtienneLescot released this 22 Aug 00:58

Changes since v1.9.0

  • fix(notes): keep the note stylesheet in the production bundle
  • fix(ci): sign the macOS .app ad-hoc when no certificate is available
  • fix(recording): stream the native webcam to disk instead of losing it
  • test(recording): make the re-index suite run off Linux
  • fix(ci): notarize release candidates like stable releases
  • fix(build): declare all 13 supported locales in the AppX package
  • ci(macos): reject a MAC_CSC_NAME that carries its certificate type
  • fix(recording): stop the WGC helper from hanging on stop
  • fix(recording): stop a webcam finalize from discarding the screen capture
  • ci(diagnostic): build the bundle for release branches too
  • fix(export): stop drawing the screen inside the PiP box on camera-less clips
  • fix(layout): resolve the webcam layout per clip, not once per timeline
  • feat(editor): turn on roundness, shadow and motion blur by default
  • fix(cursor): make the Windows cursor sampler DPI-aware
  • fix(hud): stop being born click-through, wait for the renderer to ask
  • test(hud): pin that click-through is asked for, never born with
  • docs(hud): replace the guessed exposure window with a measured one
  • fix(media): watch the background path refresh instead of firing it into the void
  • fix(agent): stop cutting the transcript at the 800th word
  • docs(agent): the transcript tool no longer caps, so stop saying it does
  • fix(ci): scope RC release notes to the previous RC
  • test(media): inject the failed registry write instead of chmod-ing the temp dir
  • feat(agent): add addTrims and addZooms, so a cut stops costing a round trip
  • fix(agent): let a malformed batch entry fall alone, like every other one
  • perf(test): run Vitest in node, and jsdom only where a DOM is needed
  • docs(agents): run the tests you touched, not the whole suite each step
  • fix(ci-scripts): clear the thread-validation timeout when fetch rejects
  • fix(renderer): handle the detached promises that can actually reject
  • fix(ai): stop compacting the chat on a context window we never measured
  • docs(readme): replace the two static screenshots with an animated demo
  • docs(readme): tighten the preamble and point the links at getopenscreen
  • docs(readme): rebuild the demo GIF from the 1440p master
  • fix(ci): re-pin ffmpeg on a month-end BtbN build
  • chore(gitignore): ignore local AUR key material
  • fix(ci): pin winget-releaser to a commit SHA
  • fix(ci): harden the AUR publish pipeline and repair its makepkg install
  • feat(ci): add a dry_run input to the AUR publish workflow
  • fix(ci): close three gaps found in CodeRabbit review of the AUR audit
  • fix(release): publish before syncing main, and stop racing the merge
  • fix(release): fail sync_main when no PR exists and main is still behind
  • ci(linux): guard the native payload, declare patchelf, drop the dead zsync glob
  • ci(linux): require each compositor ffmpeg library family individually
  • docs(readme): rebuild the demo GIF from the dark-theme master
  • fix(appx): ship branded Store tiles instead of electron-builder's placeholders
  • ci(windows-store): fail the build when the packaged tiles are not ours
  • ci(windows-store): check tiles against the generator, not against build/appx
  • fix(win): ship the compositor addon beside its ffmpeg DLLs
  • fix(linux): give the capture helper's ffmpeg libraries their own directory name
  • fix(linux): negotiate DMA-BUF so capture works on niri and other wlroots compositors
  • ci(release): make the Discord announcement dispatchable on its own
  • fix(ci): fail a manual announcement that posts nothing
  • test(ci): cover the missing-tag path under STRICT
  • fix(release): bump package-lock.json alongside package.json
  • fix(release): validate both manifests before writing either
  • fix(release): reject a version that is not a release version
  • ci: bump pinned GitHub Actions to their Node 24 majors
  • fix(linux): make the Linux build work on arm64
  • fix(linux): re-pin the arm64 ffmpeg asset and fix bindgen's include lookup at its source
  • feat(build): add the Fedora RPM target
  • ci(docs): bump the SHA-pinned Pages actions to their Node 24 majors
  • docs(ci): correct the include-hidden-files rationale in docs.yml
  • fix(linux): give the compositor's build.rs its own freestanding-header fallback
  • fix(linux): recover the DMA-BUF plane size the producer leaves at zero
  • test(media): stop the media-links temp-dir cleanup failing its own race
  • fix(linux): stop the packages needing a glibc newer than the target distro
  • fix(win): stop depending on the Visual C++ Redistributable
  • ci(win): prove the Store package loads before shipping it
  • fix(win): read delay imports too, and stop the guards masking each other
  • fix(win): drain both helper pipes at once instead of one after the other
  • fix(linux): declare the three libraries the packages need and never asked for
  • fix(linux): stop the Arch package depending on one Arch deleted
  • ci(linux): prove the packages resolve on a machine with nothing installed
  • ci(release): announce off the release itself, not off the ceremony that made it
  • fix(nix): refresh npmDepsHash, stale since well before this branch
  • fix(linux): bundle libgomp in the AppImage, the one format that cannot declare it
  • docs(build): fix a self-contradiction in the AppImage paragraph
  • ci(store): submit the appx to the Microsoft Store from the release build
  • fix(store): report the actual submission result, not the configuration
  • fix(linux): declare the portal, and name the backend that implements it
  • ci(winget): stop skipping the publish in silence
  • docs(build): name the packages instead of counting them
  • ci(winget): name the two gates that each cost a release to discover
  • docs(dist): make the Microsoft Store the recommended Windows route
  • docs(dist): describe the winget gate by its prerequisites, not its if
  • docs(dist): stop calling the winget job switched off
  • fix(win): ship the OpenMP runtime the ggml backends actually import
  • fix(win): tell a directory from a file, and find Visual Studio where it is
  • fix(wgc): add GPU DXGI path for Windows capture readback
  • fix(wgc): make the GPU encode path degrade instead of failing
  • fix(wgc): keep an encode off the frame lock, and name where it wedges
  • fix(wgc): repair the four things the GPU path got wrong under review
  • fix(wgc): build the bridge texture where a failure can still fall back
  • fix(wgc): give the audio write its own breadcrumb instead of the video's
  • fix(wgc): clear the breadcrumb by scope, not by remembering to
  • fix(win): pace the capture loop to a deadline instead of sleeping a full period
  • feat(wgc): report which GPU capture landed on, and let the tool test audio
  • style(diagnostic): wrap the two lines biome wanted wrapped
  • fix(wgc): stop the adapter report dereferencing what DXGI did not give it
  • fix(ci): start release notes from a tag that exists
  • fix(ci): let each consumer decide what "no previous release" means
  • fix(wgc): make the GPU encode path opt-in until it earns the default
  • docs(recording): stop the paragraph contradicting itself on fallback
  • fix(recording): write fragmented MP4 so a killed helper keeps its file
  • fix(wgc): report adapter LUIDs, because the descriptions can be identical
  • fix(wgc): tell "no outputs" apart from "outputs could not be read"
  • ci(homebrew): stop reporting an unpublished cask as a green release
  • feat(packaging): add the upstream AppStream metadata Flathub requires
  • fix(ci): refuse a tap name brew cannot resolve
  • docs(release): stop calling the notarized DMGs unsigned
  • ci(flatpak): spike how far Flathub actually is
  • fix(flatpak): point the spike at a repository that exists
  • docs(agents): add development principles, slim release flow, correct branch contract
  • docs(agents): address review feedback on the release-flow docs
  • docs(release): make release-and-secrets.md the only release reference
  • fix(docs-check): catch the retired branch naming in both spellings
  • test(media): let callers await the registry's background path refresh
  • fix(waveform): take ffmpeg's word when a recording has no audio track
  • refactor(camera): one answer to "does this asset have a camera"
  • fix(export): key the fallback webcam decoder by the file it actually opened
  • fix(export): decide the webcam source, its cache key and the PiP together
  • fix(wgc): make the Windows recorder DPI-aware and stop guessing its monitor
  • fix(cursor): fail the sampler when DPI awareness cannot be set
  • feat(build): let a developer package on a distro newer than the floor
  • test(build): stop asserting the host ceiling clears the pinned floor
  • fix(compositor): say when a declared camera is unreadable
  • fix(compositor): use the shared predicate for "is this a real camera"
  • fix(recording): open the recording a failed stop left playable
  • fix(editor): import a recording once, so reopening keeps the project you saved
  • feat(editor): delete a project from the Open project dialog
  • docs(e2e): say what injected input can never prove about the HUD
  • docs(e2e): give a binary-string check that works on Windows
  • docs(agents): name the thing that actually builds a capture helper
  • docs(agents): the HUD click-through rule is macOS too, not Windows only
  • docs(agents): point at the testing docs, which only linked one way
  • docs(testing): log the 1.9.5-rc.1 Windows pass in the results table
  • docs(testing): the manual tester is an agent, so say what not to drive it with
  • docs(testing): give the editor sections their own reason not to inject
  • docs(agents): orient an agent toward computer-use before it needs to know
  • docs(agents): show the control search, not just require it
  • docs(testing): log the rc.2 regression pass, and what nearly faked a bug
  • docs(testing): "the machine is at 100%" is not a reason to skip DPI
  • docs(testing): batch the computer-use grants so the operator can leave
  • docs(testing): fix the grant ordering, and name apps the way the resolver does
  • docs(testing): log the macOS rc.1 pass, and why a clean stop proves nothing
  • docs(testing): fold in the by-hand macOS repro, and correct the 'no error dialog' claim
  • docs(testing): kill the last confound — audio off, no screenshots, same death
  • docs(testing): point the macOS blocker at its fix
  • docs(testing): downgrade four claims the evidence does not carry
  • fix(recording): stop macOS fragments carrying an offset the box cannot hold
  • fix(recording): separate the two writer-failure events, and quote the rate
  • chore(release): set main to 1.9.5
  • fix(nix): refresh npmDepsHash for the 1.9.5 lockfile
  • fix(store): give msstore a project to publish, not just a package
  • fix(store): drop the write token from the Store job, and stop calling a dispatch a dry run
  • ci(store): add a retry path for Store submission that rebuilds nothing
  • ci(store): fix an empty expression, a silent skip, and an unchecked run id
  • fix(store): the option is --inputDirectory, and it takes a directory
  • feat(update): add manual release checking
  • fix(updates): harden release version checks
  • feat(update): in-place updates on Windows, macOS and Linux
  • fix(update): distinguish a failed download from a failed check
  • fix(update): apply the updater settings on every call
  • chore(nix): refresh npmDepsHash for electron-updater
  • ci(aur): say which key AUR refused, instead of just that it refused one
  • ci(aur): stop overclaiming what the probe proves, bound it, pin the key
  • docs: stop telling macOS users to strip the quarantine flag
  • fix(hud): give click-through a way out that Windows cannot revoke
  • test(hud): make the click-through negative case able to fail
  • docs(agents): the HUD lift is a cursor poll now, not a WH_MOUSE_LL hook
  • docs(agents): the poll keys off the cursor RELATIVE to the window
  • feat(website): show the real editor instead of a drawing of it
  • feat(website): let the reader drive the picture with the scroll wheel
  • fix(website): the scrubbed clip was invisible in production only
  • feat(website): reshoot the walkthrough — no stranger's face, no prices, and a timeline that matches the document
  • feat(website): the editor, redrawn live and walked through by the scroll
  • docs(recreation): write the art direction the build was missing
  • feat(website): six settings, two acts, one clock
  • feat(website): build the landing page around the editor
  • feat(website): ship the app's real cursor packs, for v4
  • feat(website): add the webcam clip the composite's bubble plays
  • feat(website): port the design's v4 recreation
  • fix(website): let the webcam play, instead of animating it
  • feat(website): the design's hero
  • fix(website): seat the clips on the floor, and close the join
  • feat(website): draw the four feature panels, as the design has them
  • perf(website): stop shipping pixels and blur nobody sees
  • perf(website): unpack two cursors from the stylesheet, and stop easing an ease
  • fix(website): let the timeline arrive, and the inspector fit what is in it
  • fix(website): close the three holes in the score, and cut the page's asides
  • fix(website): give the transcript a window, then a script that matches the take
  • fix(website): aim the pointer at where the target is, not where it was
  • feat(website): finish the page the recording is recording
  • fix(website): make the rail's scale a function of the stage, not a constant
  • feat(website): the scene, in portrait
  • feat(website): give the recorded app its window back
  • fix(website): put the hand on the handle, and the sweep on the right word
  • fix(website): the captions line was quoting the wrong thirteen
  • fix(website): the hero says who it is, and the recorded pointer points
  • fix(website): make the scroll hint a signal, and give it a screen to sit on
  • fix(website): bring the title in with the panel it announces
  • fix(website): stop reserving screen-wide height for a left-column caption
  • fix(website): hang the inspector from the caption again, not from the picture
  • fix(website): make the left column one thing, so it can be aligned with the picture
  • refactor(website): one box for both layouts, instead of two kept in step by hand
  • fix(website): stop the measuring pass flashing a caption on resize
  • fix(website): the palette hangs where the inspector hangs
  • fix(website): centre the column on what is visible, not on what is laid out
  • fix(website): hand the column over without a gap, and let portrait size the picture
  • fix(website): let the transcript fill its panel instead of guessing at the chrome
  • chore(website): make the branch pass its own lint
  • feat(website): aim the recorded pointer at the frame, not at coordinates
  • fix(website): change the caption with the panel it describes
  • fix(website): give the scene back whole when the driver stops
  • perf(website): coalesce the resize measurement into one frame
  • fix(website): read the cursor hotspots the way the app reads them
  • feat(website): end the cursor take on the green pointer
  • fix(website): make two build-time checks fail loudly instead of quietly
  • chore(website): keep a local account name out of the vendored document
  • docs(website): correct the counts, the gate width and the claims that drifted
  • fix(website): a 404 in the structured data, a literal colour, a locked CTA
  • build(website): let the generator own generated.ts, and make --check real
  • chore(release): set main to 1.9.6
  • fix(nix): refresh npmDepsHash for the 1.9.6 lockfile
  • fix(website): take the time and cut readouts off the timeline
  • fix(website): count the timeline beat the way the screen counts it
  • feat(website): give the recreation the application's light theme
  • ci(store): make the CLI say why an upload failed
  • fix(store): pin msstore-cli, whose v0.4.0 cancels every upload instantly
  • ci(store): give the release path the same verbosity as the retry path
  • fix(recording): let DirectShow convert a camera format we cannot unpack
  • fix(recording): name the camera the browser actually opened
  • fix(recording): stop losing the camera without a word
  • fix(recording): answer the review on the camera fixes
  • fix(recording): carry the microphone's name, not just its id
  • fix(recording): answer the review on the microphone fix
  • fix(recording): prove the microphone fallback on real hardware
  • fix(recording): drop the word tier from microphone matching too
  • fix(recording): match microphone names on word boundaries
  • docs(recording): state the fallback-warning condition exactly
  • fix(recording): advance the audio timeline on the clock, not on the data
  • fix(recording): answer the review on the audio timeline test
  • fix(recording): stop a camera name from matching a different camera
  • fix(recording): match camera names on word boundaries, and keep non-Latin names apart
  • test(recording): let a camera case say when it proved nothing
  • fix(preview): stop a single media error from emptying the editor
  • fix(preview): re-arm the retry budget on progress, not on a reload
  • refactor(preview): read the mounted source from the mirrors the rAF uses
  • fix(preview): key the reload budget on the media, not just the asset id
  • test(preview): pin the "any healthy source clears the card" rule
  • perf(preview): read currentTime once per frame in the sampling block
  • chore: drop the local Electron launch config from the branch
  • fix(preview): stop the reload cycle a two-spot file can keep alive
  • fix(preview): keep one demuxer seek in flight instead of ~60 a second
  • fix(preview): make the retry budget a rate, not a quota
  • fix(workbench): one tool roster, pinned in CI, instead of three hand-written ones
  • fix(workbench): the counts the roster left behind, and one lying docblock
  • fix(compositor): anchor Linux annotations on the un-zoomed screen rect
  • refactor(compositor): share the annotation rect across the three backends
  • fix(editor): restore spacing between slider labels and values
  • fix(editor): apply the scoped-style fix to the remaining pane rows
  • fix(layout): show no-webcam for camera-less projects
  • test(layout): cover camera-dependent controls
  • refactor(layout): give the effective-preset rule one home
  • fix(layout): name the preset control, and say the saved layout survives
  • fix(ai): report compacted model context
  • test(editor): cover chat budget fallbacks
  • test(editor): defer budget rejection
  • test(editor): await rejected budget fallback
  • fix(ai): measure the history the model is actually sent
  • fix(timeline): preserve partially anchored regions
  • refactor(timeline): give "is this anchored?" a single answer
  • test(timeline): cover the branch #249 was actually about
  • fix(editor): surface failed timeline saves
  • test(editor): strengthen failed-save regressions
  • chore(editor): keep auto-zoom change scoped
  • refactor(i18n): one home for translating toasts fired outside React
  • fix(editor): put the save-failure boundary where every save already goes
  • fix(ai): prevent stale agent edit overwrites
  • fix(ai): keep the agent's turn when the project moved under it
  • fix(ai): restore the agent rollback a dead catch had silenced
  • feat(captions): measure the caption band against the frame, not the footage
  • feat(compositor): honour a per-annotation coordinate space
  • feat(captions): give the inspector a horizontal offset, and honest slider bounds
  • docs(captions): describe the frame as the box captions are measured against
  • test(captions): pin the sliders to the range the band can actually reach
  • fix(captions): re-clamp offsets on patch, and unambiguous Turkish labels
  • test(captions): cover the two fields that reach the offset range indirectly
  • feat(editor): add audio mastering and webcam crop controls
  • fix(editor): address automated review findings
  • Fix reviewed editor async and ref flows
  • refactor(editor): drop auto-mastering so preview and export match
  • fix(editor): serialise timeline adds, and make two tests prove their claim
  • refactor(editor): drop the audio sync offset, leaving only the parity-safe gain
  • fix(editor): put clip insertion on the timeline queue, not beside it
  • fix(editor): let a zero-length audio track read as ended
  • test(editor): pin the preview's gain scalar the way the export's is pinned
  • fix(editor): don't schedule a teardown for an AudioContext that never existed
  • fix(editor): give the pane's sliders an accessible name
  • fix(i18n): call the audio slider what the other twelve locales already call it
  • feat(editor): show the output gain on the timeline waveform
  • fix(captions): upgrade whisper and recover GPU startup
  • fix(captions): stop whisper helper on app quit
  • fix(captions): block helper respawn during shutdown
  • fix(captions): address automated review findings
  • Make overlapping Whisper startup test deterministic
  • refactor(captions): drop the model upgrade, keeping the GPU recovery
  • fix(recording): advance the macOS audio timeline on the clock, not on the data
  • ci: build the Swift helper gate on the toolchain that ships it
  • fix(recording): measure the audio tap on what it delivered, not on the mix
  • fix(editor): lay the camera box out from the camera, not from a guess
  • feat(stt): surface the transcription timing and backend the helper reports
  • chore(stt): drop the dead --cuda build variant
  • fix(stt): only report a run's timing when every chunk was measured
  • test(stt): pin the running rtf across an unmeasured chunk
  • fix(editor): keep the webcam pan when the zoom passes through 100%
  • test(editor): cover the vertical pan axis and the pan's own recovery
  • test(e2e): drop the two stale checklist tests, clean their leftovers
  • test(recording): measure the Linux audio timeline instead of trusting it
  • fix(recording): close the pause window the audio ring left open
  • fix(recording): bound the silence the audio ring can owe
  • fix(hud): send the click-through cleanup through the wrapper that owns the mirror
  • test(hud): pin the whole setIgnoreMouseEvents tape, not one entry in it
  • docs(recording): describe the click-through path that ships since #385
  • test(hud): pin the sequence and the window, not the tail and the prototype
  • fix(build): attribute the copyright to the contributors, not one author
  • feat(app): give the app an About box and a reachable update check
  • fix(app): make the About box reachable and the update check honest
  • fix(app): split the update check's permanent and transient vetoes
  • docs(testing): cover the HUD's update button across a recording
  • fix(app): show the contributors on the About box, not one name
  • feat(app): hang an app menu off the wordmark, where About is findable
  • test(app): pin the copyright the bundle and the About box share
  • fix(metadata): point the declared URLs at the site and the current repo
  • ci(nix): build the derivation, instead of only checking its hash
  • ci(nix): separate "does it run" from "can Chromium sandbox here"
  • feat(nix): give the derivation an ffmpeg, from nixpkgs
  • ci(nix): assert against the capture stack, not against a usage string
  • ci(nix): keep the CLI's stdout apart from Chromium's, and show both
  • ci(nix): bound each command, not just the job
  • fix(cli): keep Chromium's logging off the CLI's stdout
  • ci(nix): report both streams before deciding the outcome
  • fix(cli): bound the audio probe that hangs openscreen sources
  • feat(cli): give sources an output file, since stdout cannot be cleaned
  • feat(cli): timestamped startup milestones, to locate the sources hang
  • ci(nix): five attempts per run, and settle who merges the streams
  • feat(cli): finer milestones across the window-setup gap
  • ci(nix): read the milestones from where they actually land
  • Revert "fix(cli): keep Chromium's logging off the CLI's stdout"
  • docs(cli): state why -o exists, correctly this time
  • fix(cli): bound desktop source enumeration, which is where sources hangs
  • ci(nix): tell a bounded failure apart from a hang
  • ci(nix): count a killed attempt as a failure, not as its own category
  • ci(nix): drop the temporary branch from the push filter
  • feat(nix): build the compositor addon, which is what carries export
  • ci(nix): assert that an export actually comes out
  • ci(nix): one verdict at the end, so flaky enumeration cannot hide export
  • ci(nix): give the runner a software Vulkan rasteriser
  • ci(nix): take lavapipe from nixpkgs, since apt's mesa had none
  • ci(nix): give X11 a real screen and Chromium a usable /dev/shm
  • fix(nix): give the compositor an ffmpeg that can encode H.264, under LGPL
  • fix(nix): rename the ffmpeg symbols, which is not optional after all
  • fix(nix): the compositor addon now loads, and export produces an MP4
  • ci(nix): drop the temporary branch from the push filter
  • fix(nix): give the addon a loader, a clean source tree and its own check
  • fix(cli): bound get-sources where it runs, and stop losing good enumerations
  • ci(nix): stop the job failing by construction, and give it room to finish
  • docs(cli): say that -o and --json carry different shapes
  • fix(nix): let the renamed ffmpeg copies resolve only against each other
  • fix(cli): reject an empty flag value instead of resolving it to cwd
  • fix: address the review on the -o write, the mic path and the nix job
  • fix(recording): size the capture buffer from the filter, not the display mode
  • fix(recording): count the tap's catch-up apart from audio it lost
  • test(recording): stop the macOS timeline test failing on playback latency
  • feat(editor): reach the AI provider settings from the app menu
  • fix(editor): stop editor shortcuts reaching the timeline under a modal
  • fix(editor): restore focus when a modal closes, commit the dialog ref in its openers
  • ci(nix): let the job finish, and stop it blaming export for a capture failure
  • feat(diagnostics): time desktop source enumeration under the diagnostic flag
  • fix: correct the concurrency claim and stop calling every rejection a timeout
  • feat(ai-edition): a zoom write reports where the pointer really was
  • feat(workbench): split the behaviour axis, judge the half that reads
  • fix(workbench): close five holes in the judge, four of them silent
  • ci(nix): print the get-sources duration on every attempt, not just failures
  • fix(workbench): union the zoom denominator, derive the turn timeout from the harness
  • fix(stt): log a startup death once, and name the sentence's real author
  • fix(stt): move the clock, not the timers, in the readiness-timeout test
  • fix(stt): keep one voice on a spawn error too, not just on an exit
  • test(stt): drop five platform ternaries that decide nothing
  • ci(nix): run record before sources, to test whether position is the cause
  • ci(nix): count run_cli invocations, so the A/B is readable at all
  • fix(editor): suppress editor shortcuts under every modal, not just some
  • fix(editor): treat a malformed legacyEditor envelope as absent, not as a crash
  • fix(editor): apply the Edit Clip source range and crop as one document, one save
  • fix(editor): refuse Full Camera on a project that has no webcam
  • test(ai-edition): share one base document in the addZoom invariant
  • feat(export): keep "Show in folder" on the success panel, not only in the toast
  • test(ai-edition): pin the fixture clock instead of racing it
  • ci(nix): put record back after sources, and record why the experiment failed
  • fix(workbench): make the third verdict reachable, then migrate onto it
  • fix(workbench): record which model answered, not only which one was asked for
  • fix(hud): dismiss the HUD popovers when the window loses focus
  • feat(nix): package the PipeWire capture helper
  • ci(nix): check the helper's dlopen contract, not its DT_NEEDED list
  • feat(nix): package the whisper-stt server
  • fix(editor): make undo/redo actually apply
  • fix(editor): record undo history only after a write lands, and force the call site to say
  • fix(editor): make every write name its own history decision, wrapper or not
  • fix(editor): point the modal-guard test at the module that still exports pushHistory
  • fix(undo): close the two holes in the write audit's guarantee
  • fix(editor): stop a drag's snapshot outliving the drag, and the project
  • test(editor): say what the write audit checks, and stop claiming the rest
  • fix(editor): give useTimeline's two drag commits the guard the other two got
  • test(editor): count the third writer the audit could not see
  • docs(editor): fix the mount count, and say where the parity stops
  • docs(editor): drop the delete route from the reachability comment
  • fix(editor): drop an asset import the user has already moved on from
  • test(editor): follow main's Edit Clip Apply into the write audit
  • fix(nix): build whisper-stt CPU-only; the Vulkan shader gen cannot fork
  • refactor(workbench): retire the last meaning regex, under a new check id
  • docs(workbench): the note said the real scenarios could not migrate — they did
  • fix(workbench): retire beh.sandbox from the baseline, confirmed at n=10
  • refactor(workbench): retire the meaning regex a scenario file hid
  • test(workbench): wire the second half of a bidirectional rubric
  • fix(nix): add the helper's pipewire RPATH in postFixup, after the shrink
  • fix(nix): move the addon's vulkan RPATH to postFixup too, and assert it
  • feat(editor): merge the background facet into video effects
  • feat(editor): one switch for "no background", derived from the four settings
  • fix(editor): size the background picker to the room it has, not to a guess
  • fix(editor): make the picker's tabs real tabs, and its swatch unable to throw
  • fix(editor): say when "fill frame" only fills some of the clips
  • docs: fix four stale references in editor-shell.md
  • feat(editor): let the user pick which shape "fill frame" fills
  • feat(editor): make "fill frame" an action with a picker, not a switch
  • feat(editor): "fit the clip" is an action, not a state
  • feat(editor): move the output format next to the frame it shapes, rename the pane
  • fix(editor): one Format row, and lift "fit" onto the section header
  • test(editor): assert what "fit" writes, and localize the native format label
  • fix(i18n): select the plural form by category, and unbreak the tests typecheck

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