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