Skip to content

feat: a demo is never ugly (audit integration) - #814

Merged
EtienneLescot merged 159 commits into
mainfrom
integration/demo-never-ugly
Sep 27, 2026
Merged

EtienneLescot merged 159 commits into
mainfrom
integration/demo-never-ugly

Conversation

@EtienneLescot

@EtienneLescot EtienneLescot commented Sep 26, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Every change from the "a demo is never ugly" audit, gathered in one branch so they can be tested together and land on main as a whole. Each audit PR is merged into this branch in dependency order. From now on, review and functional testing happen here.

Merged PRs, in order: #766, #792, #793, #795, #796, #797, #798, #800, #799, #801, #802, #803, #804, #805, #806, #807, #808, #809, #810, #811, #812.

What it covers:

  • bounds in the model and a reset on every slider;
  • defaults that look good;
  • named choices;
  • audio loudness and ducking;
  • export bitrate, GIF dithering and destinations;
  • bundled fonts;
  • 3D without roll and with motion blur;
  • anchored camera and follow dead zone;
  • silence cuts that breathe;
  • new projects that keep the last look;
  • readable text and caption styles;
  • honest gradients;
  • on-screen units, zoom cap and vertical reframing;
  • annotation exits and CLI parity;
  • recording hygiene;
  • removal of the sweezy-cursors.com packs.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Important

Review skipped

Too many files!

This PR contains 538 files, which is 238 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 64a3c31b-82e4-4528-aaa6-25dd469078ca

📥 Commits

Reviewing files that changed from the base of the PR and between 76cfe81 and e8b51be.

⛔ Files ignored due to path filters (91)
  • crates/compositor/src/shaders.hlsl is excluded by !**/*.hlsl
  • design/cursors/3d-concept.png is excluded by !**/*.png
  • design/cursors/contact-sheet.png is excluded by !**/*.png
  • design/cursors/dark-32px.png is excluded by !**/*.png
  • design/cursors/pixel-candy/source.png is excluded by !**/*.png
  • design/cursors/pop-coral/source.png is excluded by !**/*.png
  • design/cursors/prism-glow/source.png is excluded by !**/*.png
  • design/cursors/star-sprout/source.png is excluded by !**/*.png
  • design/cursors/studio-ink/source.png is excluded by !**/*.png
  • public/cursors/among-us-sus-knife-and-red-animated/arrow.png is excluded by !**/*.png
  • public/cursors/among-us-sus-knife-and-red-animated/pointer.png is excluded by !**/*.png
  • public/cursors/black-and-rainbow-stroke-gradient-animated/arrow.png is excluded by !**/*.png
  • public/cursors/black-and-rainbow-stroke-gradient-animated/pointer.png is excluded by !**/*.png
  • public/cursors/black-pixel/arrow.png is excluded by !**/*.png
  • public/cursors/black-pixel/pointer.png is excluded by !**/*.png
  • public/cursors/christmas-miles-morales/arrow.png is excluded by !**/*.png
  • public/cursors/christmas-miles-morales/pointer.png is excluded by !**/*.png
  • public/cursors/default/app-starting.png is excluded by !**/*.png
  • public/cursors/default/arrow.png is excluded by !**/*.png
  • public/cursors/default/closed-hand.png is excluded by !**/*.png
  • public/cursors/default/crosshair.png is excluded by !**/*.png
  • public/cursors/default/help.png is excluded by !**/*.png
  • public/cursors/default/move.png is excluded by !**/*.png
  • public/cursors/default/not-allowed.png is excluded by !**/*.png
  • public/cursors/default/open-hand.png is excluded by !**/*.png
  • public/cursors/default/pointer.png is excluded by !**/*.png
  • public/cursors/default/resize-ew.png is excluded by !**/*.png
  • public/cursors/default/resize-nesw.png is excluded by !**/*.png
  • public/cursors/default/resize-ns.png is excluded by !**/*.png
  • public/cursors/default/resize-nwse.png is excluded by !**/*.png
  • public/cursors/default/text.png is excluded by !**/*.png
  • public/cursors/default/up-arrow.png is excluded by !**/*.png
  • public/cursors/default/wait.png is excluded by !**/*.png
  • public/cursors/hello-kitty-watermelon/arrow.png is excluded by !**/*.png
  • public/cursors/hello-kitty-watermelon/pointer.png is excluded by !**/*.png
  • public/cursors/hollow-knight-and-game-arrow/arrow.png is excluded by !**/*.png
  • public/cursors/hollow-knight-and-game-arrow/pointer.png is excluded by !**/*.png
  • public/cursors/hollow-knight-nail-sword-and-mask/arrow.png is excluded by !**/*.png
  • public/cursors/hollow-knight-nail-sword-and-mask/pointer.png is excluded by !**/*.png
  • public/cursors/mickey-mouse-black-hand-inflated-glove/arrow.png is excluded by !**/*.png
  • public/cursors/mickey-mouse-black-hand-inflated-glove/pointer.png is excluded by !**/*.png
  • public/cursors/naruto-akatsuki-cloud-arrow/arrow.png is excluded by !**/*.png
  • public/cursors/naruto-akatsuki-cloud-arrow/pointer.png is excluded by !**/*.png
  • public/cursors/old-roblox/arrow.png is excluded by !**/*.png
  • public/cursors/old-roblox/pointer.png is excluded by !**/*.png
  • public/cursors/pink-glossy-arrow-and-hand-3d/arrow.png is excluded by !**/*.png
  • public/cursors/pink-glossy-arrow-and-hand-3d/pointer.png is excluded by !**/*.png
  • public/cursors/pinky-pixel/arrow.png is excluded by !**/*.png
  • public/cursors/pinky-pixel/pointer.png is excluded by !**/*.png
  • public/cursors/pixel-candy/arrow.png is excluded by !**/*.png
  • public/cursors/pixel-candy/pointer.png is excluded by !**/*.png
  • public/cursors/pokemon-neon-gengar/arrow.png is excluded by !**/*.png
  • public/cursors/pokemon-neon-gengar/pointer.png is excluded by !**/*.png
  • public/cursors/pop-coral/arrow.png is excluded by !**/*.png
  • public/cursors/pop-coral/pointer.png is excluded by !**/*.png
  • public/cursors/prism-glow/arrow.png is excluded by !**/*.png
  • public/cursors/prism-glow/pointer.png is excluded by !**/*.png
  • public/cursors/sanrio-gudetama-and-arrow-kawaii/arrow.png is excluded by !**/*.png
  • public/cursors/sanrio-gudetama-and-arrow-kawaii/pointer.png is excluded by !**/*.png
  • public/cursors/sanrio-kuromi-skull-arrow/arrow.png is excluded by !**/*.png
  • public/cursors/sanrio-kuromi-skull-arrow/pointer.png is excluded by !**/*.png
  • public/cursors/solo-leveling-sung-jinwoo-dark-flames/arrow.png is excluded by !**/*.png
  • public/cursors/solo-leveling-sung-jinwoo-dark-flames/pointer.png is excluded by !**/*.png
  • public/cursors/spring-gradient/arrow.png is excluded by !**/*.png
  • public/cursors/spring-gradient/pointer.png is excluded by !**/*.png
  • public/cursors/star-sprout/arrow.png is excluded by !**/*.png
  • public/cursors/star-sprout/pointer.png is excluded by !**/*.png
  • public/cursors/studio-ink/arrow.png is excluded by !**/*.png
  • public/cursors/studio-ink/pointer.png is excluded by !**/*.png
  • public/fonts/Caveat-Bold.ttf is excluded by !**/*.ttf
  • public/fonts/Caveat-Regular.ttf is excluded by !**/*.ttf
  • public/fonts/IBMPlexMono-Bold.ttf is excluded by !**/*.ttf
  • public/fonts/IBMPlexMono-Regular.ttf is excluded by !**/*.ttf
  • public/fonts/Inter-Bold.ttf is excluded by !**/*.ttf
  • public/fonts/Inter-Regular.ttf is excluded by !**/*.ttf
  • public/fonts/Lora-Bold.ttf is excluded by !**/*.ttf
  • public/fonts/Lora-Regular.ttf is excluded by !**/*.ttf
  • public/fonts/Oswald-Bold.ttf is excluded by !**/*.ttf
  • public/fonts/Oswald-Regular.ttf is excluded by !**/*.ttf
  • website/static/img/cursors/00-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/01-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/02-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/03-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/04-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/05-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/06-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/07-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/08-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/09-arrow.png is excluded by !**/*.png
  • website/static/img/cursors/mac-pointer.png is excluded by !**/*.png
  • website/static/img/cursors/mac-text.png is excluded by !**/*.png
📒 Files selected for processing (538)
  • .github/workflows/update-homebrew-cask.yml
  • AGENTS.md
  • README.md
  • THIRD-PARTY-NOTICES.md
  • crates/compositor-view-napi/src/lib.rs
  • crates/compositor/src/audio.rs
  • crates/compositor/src/audio_jobs.rs
  • crates/compositor/src/camera.rs
  • crates/compositor/src/compositor_linux.rs
  • crates/compositor/src/compositor_macos.rs
  • crates/compositor/src/compositor_windows.rs
  • crates/compositor/src/config.rs
  • crates/compositor/src/cursor.rs
  • crates/compositor/src/cursor_sdf.rs
  • crates/compositor/src/frame_geometry.rs
  • crates/compositor/src/gif_export.rs
  • crates/compositor/src/lib.rs
  • crates/compositor/src/live.rs
  • crates/compositor/src/pipeline_linux.rs
  • crates/compositor/src/pipeline_macos.rs
  • crates/compositor/src/pipeline_windows.rs
  • crates/compositor/src/regions.rs
  • crates/compositor/src/scene.rs
  • crates/compositor/src/sculpt.rs
  • crates/compositor/src/shaders.metal
  • crates/compositor/src/text_anim.rs
  • crates/compositor/src/text_fonts.rs
  • crates/compositor/src/text_linux.rs
  • crates/compositor/src/text_macos.rs
  • crates/compositor/src/text_windows.rs
  • crates/compositor/src/timeline_walk.rs
  • crates/compositor/src/vk_shaders/layer.wgsl
  • crates/compositor/tests/animated_background.rs
  • crates/compositor/tests/click_impact_render.rs
  • crates/compositor/tests/compose_linux.rs
  • crates/compositor/tests/cursor_model_render.rs
  • crates/compositor/tests/cursor_tap_render.rs
  • crates/compositor/tests/device_frame_render.rs
  • crates/compositor/tests/export_timing.rs
  • crates/compositor/tests/follow_camera_render.rs
  • crates/compositor/tests/privacy_blur_under_zoom.rs
  • crates/compositor/tests/screen_trail_render.rs
  • crates/poc-d3d/src/bench.rs
  • design/DESIGN.md
  • design/SKILL.md
  • design/_ds_manifest.json
  • design/components/editor/TimelinePill.jsx
  • design/components/editor/editor.card.html
  • design/components/forms/ChoiceRow.jsx
  • design/components/forms/Select.jsx
  • design/components/forms/Slider.jsx
  • design/components/forms/forms.card.html
  • design/cursors/3d-direction.md
  • design/cursors/README.md
  • design/cursors/requirements.md
  • design/guidelines/colors-semantic.card.html
  • design/openscreen-editor.html
  • design/readme.md
  • design/tokens/v4.css
  • design/ui_kits/editor/README.md
  • design/ui_kits/editor/index.html
  • docs/3d-effects-v2.md
  • electron-builder.json5
  • electron/ai-edition/agent-tools.test.ts
  • electron/ai-edition/agent-tools.ts
  • electron/ai-edition/deep-agent/service.ts
  • electron/ai-edition/document-service.test.ts
  • electron/ai-edition/document-service.ts
  • electron/ai-edition/style-preset-service.test.ts
  • electron/ai-edition/style-preset-service.ts
  • electron/app-settings.test.ts
  • electron/app-settings.ts
  • electron/cli/args.test.ts
  • electron/cli/args.ts
  • electron/electron-env.d.ts
  • electron/ipc/handlers.ts
  • electron/ipc/nativeBridge.presets.test.ts
  • electron/ipc/nativeBridge.ts
  • electron/ipc/recordingPrefs.test.ts
  • electron/ipc/recordingPrefs.ts
  • electron/media/cursorSidecar.test.ts
  • electron/media/cursorSidecar.ts
  • electron/native-bridge/screen/macPickerSession.test.ts
  • electron/native-bridge/screen/macPickerSession.ts
  • electron/native-bridge/services/compositorViewService.test.ts
  • electron/native-bridge/services/compositorViewService.ts
  • electron/native/README.md
  • electron/native/compositor-view/addon.d.ts
  • electron/native/screencapturekit/Sources/OpenScreenCaptureCore/AudioBufferListSampleBuffer.swift
  • electron/native/screencapturekit/Sources/OpenScreenCaptureCore/CaptureWindowExclusion.swift
  • electron/native/screencapturekit/Sources/OpenScreenCaptureCore/PickerSessionCommand.swift
  • electron/native/screencapturekit/Sources/OpenScreenScreenCaptureKitHelper/PickerSession.swift
  • electron/native/screencapturekit/Sources/OpenScreenScreenCaptureKitHelper/ScreenCaptureRecorder.swift
  • electron/native/screencapturekit/Sources/OpenScreenScreenCaptureKitHelper/SystemAudioTap.swift
  • electron/native/screencapturekit/Tests/OpenScreenCaptureCoreTests/AudioBufferListSampleBufferTests.swift
  • electron/native/screencapturekit/Tests/OpenScreenCaptureCoreTests/CaptureWindowExclusionTests.swift
  • electron/native/screencapturekit/Tests/OpenScreenCaptureCoreTests/PickerSessionCommandTests.swift
  • electron/native/wgc-capture/CMakeLists.txt
  • electron/native/wgc-capture/src/desktop_icon_cover.cpp
  • electron/native/wgc-capture/src/desktop_icon_cover.h
  • electron/native/wgc-capture/src/main.cpp
  • electron/permissions/index.ts
  • electron/permissions/macPermissions.test.ts
  • electron/permissions/macPermissions.ts
  • electron/preload.ts
  • electron/recording/nativeMacCaptureStop.test.ts
  • electron/recording/nativeMacCaptureStop.ts
  • electron/recording/nativeWindowsCaptureStop.test.ts
  • electron/recording/nativeWindowsCaptureStop.ts
  • nix/package.nix
  • public/fonts/Caveat-OFL.txt
  • public/fonts/IBMPlexMono-OFL.txt
  • public/fonts/Inter-OFL.txt
  • public/fonts/Lora-OFL.txt
  • public/fonts/Oswald-OFL.txt
  • scripts/generate-default-cursor-sprites.mjs
  • scripts/generate-original-cursor-themes.mjs
  • scripts/i18n-check.mjs
  • src/App.tsx
  • src/cli/CliExportRunner.tsx
  • src/cli/captionAnnotations.test.ts
  • src/cli/captionAnnotations.ts
  • src/cli/vendor/zoomHelpers.ts
  • src/components/ai-edition/AnnotationLayer.test.tsx
  • src/components/ai-edition/AnnotationLayer.tsx
  • src/components/ai-edition/AnnotationOverlay.tsx
  • src/components/ai-edition/CaptionsPane.choices.test.tsx
  • src/components/ai-edition/CaptionsPane.placement.test.tsx
  • src/components/ai-edition/CaptionsPane.tsx
  • src/components/ai-edition/ChoiceRow.test.tsx
  • src/components/ai-edition/ColorField.tsx
  • src/components/ai-edition/CursorPane.levels.test.tsx
  • src/components/ai-edition/CursorPane.preview.test.tsx
  • src/components/ai-edition/EditClipModal.test.tsx
  • src/components/ai-edition/ExportDialog.cancel.test.tsx
  • src/components/ai-edition/ExportDialog.params.test.tsx
  • src/components/ai-edition/ExportDialog.tsx
  • src/components/ai-edition/Modals.tsx
  • src/components/ai-edition/NewEditorShell.module.css
  • src/components/ai-edition/NewEditorShell.tsx
  • src/components/ai-edition/Preview.tsx
  • src/components/ai-edition/PreviewCanvas.tsx
  • src/components/ai-edition/RightPanes.audioTrack.test.tsx
  • src/components/ai-edition/RightPanes.backgroundMotion.test.tsx
  • src/components/ai-edition/RightPanes.backgroundPicker.test.tsx
  • src/components/ai-edition/RightPanes.composition.test.tsx
  • src/components/ai-edition/RightPanes.layout.test.tsx
  • src/components/ai-edition/RightPanes.tsx
  • src/components/ai-edition/SliderCell.test.tsx
  • src/components/ai-edition/StylePresetsMenu.tsx
  • src/components/ai-edition/TextColorField.test.tsx
  • src/components/ai-edition/TextColorField.tsx
  • src/components/ai-edition/TranscriptPane.captions.test.tsx
  • src/components/ai-edition/TranscriptPane.keyboardCut.test.tsx
  • src/components/ai-edition/TransportBar.test.tsx
  • src/components/ai-edition/TransportBar.tsx
  • src/components/ai-edition/VirtualPreview.audio.test.ts
  • src/components/ai-edition/VirtualPreview.mediaError.test.tsx
  • src/components/ai-edition/VirtualPreview.playback.test.tsx
  • src/components/ai-edition/VirtualPreview.tsx
  • src/components/ai-edition/WebcamOverlay.test.tsx
  • src/components/ai-edition/depthOfFieldToggle.test.tsx
  • src/components/ai-edition/fitClip.test.ts
  • src/components/ai-edition/fitClipShapes.test.tsx
  • src/components/ai-edition/formatFill.test.tsx
  • src/components/ai-edition/recordedCursorTypes.test.ts
  • src/components/ai-edition/recordedCursorTypes.ts
  • src/components/ai-edition/recordingImport.test.ts
  • src/components/ai-edition/recordingImport.ts
  • src/components/ai-edition/roundnessUnderFrame.test.tsx
  • src/components/ai-edition/v4/EditorShellV4.module.css
  • src/components/ai-edition/v4/FloatingInspector.test.tsx
  • src/components/ai-edition/v4/FloatingInspector.tsx
  • src/components/ai-edition/v4/RecStage.test.tsx
  • src/components/ai-edition/v4/RecStage.tsx
  • src/components/ai-edition/v4/SpeedControl.test.tsx
  • src/components/ai-edition/v4/V4Timeline.geometry.test.tsx
  • src/components/ai-edition/v4/V4Timeline.tsx
  • src/components/ai-edition/v4/V4Timeline.waveform.test.tsx
  • src/components/ai-edition/v4/ZoomLevelControl.test.tsx
  • src/components/launch/HudDeviceSettings.tsx
  • src/components/launch/LaunchWindow.test.tsx
  • src/components/launch/LaunchWindow.tsx
  • src/components/permissions/PermissionsWindow.test.tsx
  • src/components/permissions/PermissionsWindow.tsx
  • src/components/ui/gradient-editor.test.tsx
  • src/components/ui/gradient-editor.tsx
  • src/components/ui/sonner.test.tsx
  • src/components/ui/sonner.tsx
  • src/components/video-editor/customPlaybackSpeed.test.ts
  • src/components/video-editor/editorDefaults.ts
  • src/components/video-editor/projectPersistence.test.ts
  • src/components/video-editor/projectPersistence.ts
  • src/components/video-editor/types.ts
  • src/hooks/useEditorHistory.ts
  • src/hooks/useScreenRecorder.nativeMacStartWarning.test.tsx
  • src/hooks/useScreenRecorder.prefsRace.test.tsx
  • src/hooks/useScreenRecorder.ts
  • src/i18n/locales/ar/common.json
  • src/i18n/locales/ar/editor.json
  • src/i18n/locales/ar/launch.json
  • src/i18n/locales/ar/settings.json
  • src/i18n/locales/ar/timeline.json
  • src/i18n/locales/cs/common.json
  • src/i18n/locales/cs/editor.json
  • src/i18n/locales/cs/launch.json
  • src/i18n/locales/cs/settings.json
  • src/i18n/locales/cs/timeline.json
  • src/i18n/locales/de/common.json
  • src/i18n/locales/de/editor.json
  • src/i18n/locales/de/launch.json
  • src/i18n/locales/de/settings.json
  • src/i18n/locales/de/timeline.json
  • src/i18n/locales/en/common.json
  • src/i18n/locales/en/editor.json
  • src/i18n/locales/en/launch.json
  • src/i18n/locales/en/settings.json
  • src/i18n/locales/en/timeline.json
  • src/i18n/locales/es/common.json
  • src/i18n/locales/es/editor.json
  • src/i18n/locales/es/launch.json
  • src/i18n/locales/es/settings.json
  • src/i18n/locales/es/timeline.json
  • src/i18n/locales/fr/common.json
  • src/i18n/locales/fr/editor.json
  • src/i18n/locales/fr/launch.json
  • src/i18n/locales/fr/settings.json
  • src/i18n/locales/fr/timeline.json
  • src/i18n/locales/it/common.json
  • src/i18n/locales/it/editor.json
  • src/i18n/locales/it/launch.json
  • src/i18n/locales/it/settings.json
  • src/i18n/locales/it/timeline.json
  • src/i18n/locales/ja-JP/common.json
  • src/i18n/locales/ja-JP/editor.json
  • src/i18n/locales/ja-JP/launch.json
  • src/i18n/locales/ja-JP/settings.json
  • src/i18n/locales/ja-JP/timeline.json
  • src/i18n/locales/ko-KR/common.json
  • src/i18n/locales/ko-KR/editor.json
  • src/i18n/locales/ko-KR/launch.json
  • src/i18n/locales/ko-KR/settings.json
  • src/i18n/locales/ko-KR/timeline.json
  • src/i18n/locales/pt-BR/common.json
  • src/i18n/locales/pt-BR/editor.json
  • src/i18n/locales/pt-BR/launch.json
  • src/i18n/locales/pt-BR/settings.json
  • src/i18n/locales/pt-BR/timeline.json
  • src/i18n/locales/ru/common.json
  • src/i18n/locales/ru/editor.json
  • src/i18n/locales/ru/launch.json
  • src/i18n/locales/ru/settings.json
  • src/i18n/locales/ru/timeline.json
  • src/i18n/locales/tr/common.json
  • src/i18n/locales/tr/editor.json
  • src/i18n/locales/tr/launch.json
  • src/i18n/locales/tr/settings.json
  • src/i18n/locales/tr/timeline.json
  • src/i18n/locales/vi/common.json
  • src/i18n/locales/vi/editor.json
  • src/i18n/locales/vi/launch.json
  • src/i18n/locales/vi/settings.json
  • src/i18n/locales/vi/timeline.json
  • src/i18n/locales/zh-CN/common.json
  • src/i18n/locales/zh-CN/editor.json
  • src/i18n/locales/zh-CN/launch.json
  • src/i18n/locales/zh-CN/settings.json
  • src/i18n/locales/zh-CN/timeline.json
  • src/i18n/locales/zh-TW/common.json
  • src/i18n/locales/zh-TW/editor.json
  • src/i18n/locales/zh-TW/launch.json
  • src/i18n/locales/zh-TW/settings.json
  • src/i18n/locales/zh-TW/timeline.json
  • src/index.css
  • src/lib/ai-edition/annotations/background.test.ts
  • src/lib/ai-edition/annotations/background.ts
  • src/lib/ai-edition/annotations/placement.test.ts
  • src/lib/ai-edition/annotations/placement.ts
  • src/lib/ai-edition/captions/captions.test.ts
  • src/lib/ai-edition/captions/index.ts
  • src/lib/ai-edition/captions/settings.ts
  • src/lib/ai-edition/captions/wordsPerLine.ts
  • src/lib/ai-edition/document/migrate.test.ts
  • src/lib/ai-edition/document/migrate.ts
  • src/lib/ai-edition/document/outputFormat.test.ts
  • src/lib/ai-edition/document/outputFormat.ts
  • src/lib/ai-edition/document/timeline.test.ts
  • src/lib/ai-edition/document/timeline.ts
  • src/lib/ai-edition/perf/uiFrameProbe.ts
  • src/lib/ai-edition/schema/index.test.ts
  • src/lib/ai-edition/schema/index.ts
  • src/lib/ai-edition/store/editorSettings.test.ts
  • src/lib/ai-edition/store/editorSettings.ts
  • src/lib/ai-edition/store/useEditorSettings.test.ts
  • src/lib/ai-edition/store/useEditorSettings.ts
  • src/lib/ai-edition/store/useTimeline.test.ts
  • src/lib/ai-edition/store/useTimeline.ts
  • src/lib/ai-edition/stylePresets.test.ts
  • src/lib/ai-edition/stylePresets.ts
  • src/lib/ai-edition/stylePresetsEditor.test.ts
  • src/lib/ai-edition/stylePresetsEditor.ts
  • src/lib/ai-edition/textContrast.test.ts
  • src/lib/ai-edition/textContrast.ts
  • src/lib/ai-edition/timeline/apply-auto-zooms.test.ts
  • src/lib/ai-edition/timeline/apply-auto-zooms.ts
  • src/lib/ai-edition/timeline/cursor-track.ts
  • src/lib/ai-edition/timeline/cut-breath.test.ts
  • src/lib/ai-edition/timeline/cut-breath.ts
  • src/lib/ai-edition/timeline/zoom-scale.test.ts
  • src/lib/ai-edition/timeline/zoom-scale.ts
  • src/lib/ai-edition/timeline/zoom-suggestions.test.ts
  • src/lib/ai-edition/timeline/zoom-suggestions.ts
  • src/lib/cliContracts.ts
  • src/lib/compositeLayout.test.ts
  • src/lib/compositeLayout.ts
  • src/lib/cursor/cursorThemes.test.ts
  • src/lib/cursor/cursorThemes.ts
  • src/lib/exporter/mp4ExportSettings.test.ts
  • src/lib/exporter/mp4ExportSettings.ts
  • src/lib/exporter/types.ts
  • src/lib/frameFootprint.test.ts
  • src/lib/frameFootprint.ts
  • src/lib/gradientBuilder.test.ts
  • src/lib/gradientBuilder.ts
  • src/lib/nativeMacRecording.ts
  • src/lib/projectDefaults.ts
  • src/lib/textFonts.test.ts
  • src/lib/textFonts.ts
  • src/lib/wallpaper.ts
  • src/lib/zoomMath/constants.ts
  • src/lib/zoomMath/zoomRegionUtils.ts
  • src/native/browserShim.presets.test.ts
  • src/native/browserShim.ts
  • src/native/client.ts
  • src/native/compositorViewClient.ts
  • src/native/contracts.ts
  • src/native/hooks/useNativeCompositorView.test.ts
  • src/native/hooks/useNativeCompositorView.ts
  • src/native/nativeCompositorStore.test.ts
  • src/native/nativeCompositorStore.ts
  • src/native/paramUnits.ts
  • src/native/sceneDescription.test.ts
  • src/native/sceneDescription.ts
  • src/styles/design-tokens.css
  • src/styles/fonts.css
  • src/utils/aspectRatioUtils.ts
  • src/utils/platformUtils.test.ts
  • src/utils/platformUtils.ts
  • technical-documentation/architecture/cursor.md
  • technical-documentation/architecture/editor-shell.md
  • technical-documentation/architecture/export-pipeline.md
  • technical-documentation/architecture/native-compositor.md
  • technical-documentation/architecture/recording.md
  • technical-documentation/architecture/timeline-model.md
  • technical-documentation/engineering/build-and-packaging.md
  • technical-documentation/engineering/rendering-performance.md
  • technical-documentation/testing/manual-e2e-checklist.md
  • technical-documentation/testing/native-cursor-diagnostics.md
  • tests/e2e/gif-export.spec.ts
  • website/blog/2026-09-27-making-of-v2-a-demo-is-never-ugly.md
  • website/docs/ai-editing.md
  • website/docs/cli.md
  • website/docs/editing-timeline.md
  • website/docs/export.md
  • website/docs/faq.md
  • website/docs/guides/product-demo-video.md
  • website/docs/installation.md
  • website/docs/intro.md
  • website/docs/quick-start.md
  • website/docs/recording.md
  • website/i18n/TRANSLATING.md
  • website/i18n/code.source.json
  • website/i18n/de/code.json
  • website/i18n/de/docusaurus-plugin-content-docs/current/ai-editing.md
  • website/i18n/de/docusaurus-plugin-content-docs/current/cli.md
  • website/i18n/de/docusaurus-plugin-content-docs/current/editing-timeline.md
  • website/i18n/de/docusaurus-plugin-content-docs/current/export.md
  • website/i18n/de/docusaurus-plugin-content-docs/current/faq.md
  • website/i18n/de/docusaurus-plugin-content-docs/current/guides/product-demo-video.md
  • website/i18n/de/docusaurus-plugin-content-docs/current/installation.md
  • website/i18n/de/docusaurus-plugin-content-docs/current/intro.md
  • website/i18n/de/docusaurus-plugin-content-docs/current/quick-start.md
  • website/i18n/de/docusaurus-plugin-content-docs/current/recording.md
  • website/i18n/de/docusaurus-plugin-content-pages/alternatives/camtasia.mdx
  • website/i18n/de/docusaurus-plugin-content-pages/alternatives/loom.mdx
  • website/i18n/de/docusaurus-plugin-content-pages/alternatives/screen-studio.mdx
  • website/i18n/de/docusaurus-plugin-content-pages/compare/openscreen-vs-cap.mdx
  • website/i18n/de/docusaurus-plugin-content-pages/compare/openscreen-vs-obs.mdx
  • website/i18n/de/docusaurus-plugin-content-pages/features/auto-zoom.mdx
  • website/i18n/de/docusaurus-plugin-content-pages/screen-recorder-linux.mdx
  • website/i18n/de/docusaurus-plugin-content-pages/screen-recorder-mac.mdx
  • website/i18n/de/docusaurus-plugin-content-pages/screen-recorder-windows.mdx
  • website/i18n/es/code.json
  • website/i18n/es/docusaurus-plugin-content-docs/current/ai-editing.md
  • website/i18n/es/docusaurus-plugin-content-docs/current/cli.md
  • website/i18n/es/docusaurus-plugin-content-docs/current/editing-timeline.md
  • website/i18n/es/docusaurus-plugin-content-docs/current/export.md
  • website/i18n/es/docusaurus-plugin-content-docs/current/faq.md
  • website/i18n/es/docusaurus-plugin-content-docs/current/guides/product-demo-video.md
  • website/i18n/es/docusaurus-plugin-content-docs/current/installation.md
  • website/i18n/es/docusaurus-plugin-content-docs/current/intro.md
  • website/i18n/es/docusaurus-plugin-content-docs/current/quick-start.md
  • website/i18n/es/docusaurus-plugin-content-docs/current/recording.md
  • website/i18n/es/docusaurus-plugin-content-pages/alternatives/camtasia.mdx
  • website/i18n/es/docusaurus-plugin-content-pages/alternatives/loom.mdx
  • website/i18n/es/docusaurus-plugin-content-pages/alternatives/screen-studio.mdx
  • website/i18n/es/docusaurus-plugin-content-pages/compare/openscreen-vs-cap.mdx
  • website/i18n/es/docusaurus-plugin-content-pages/compare/openscreen-vs-obs.mdx
  • website/i18n/es/docusaurus-plugin-content-pages/features/auto-zoom.mdx
  • website/i18n/es/docusaurus-plugin-content-pages/screen-recorder-linux.mdx
  • website/i18n/es/docusaurus-plugin-content-pages/screen-recorder-mac.mdx
  • website/i18n/es/docusaurus-plugin-content-pages/screen-recorder-windows.mdx
  • website/i18n/fr/code.json
  • website/i18n/fr/docusaurus-plugin-content-docs/current/ai-editing.md
  • website/i18n/fr/docusaurus-plugin-content-docs/current/cli.md
  • website/i18n/fr/docusaurus-plugin-content-docs/current/editing-timeline.md
  • website/i18n/fr/docusaurus-plugin-content-docs/current/export.md
  • website/i18n/fr/docusaurus-plugin-content-docs/current/faq.md
  • website/i18n/fr/docusaurus-plugin-content-docs/current/guides/product-demo-video.md
  • website/i18n/fr/docusaurus-plugin-content-docs/current/installation.md
  • website/i18n/fr/docusaurus-plugin-content-docs/current/intro.md
  • website/i18n/fr/docusaurus-plugin-content-docs/current/quick-start.md
  • website/i18n/fr/docusaurus-plugin-content-docs/current/recording.md
  • website/i18n/fr/docusaurus-plugin-content-pages/alternatives/camtasia.mdx
  • website/i18n/fr/docusaurus-plugin-content-pages/alternatives/loom.mdx
  • website/i18n/fr/docusaurus-plugin-content-pages/alternatives/screen-studio.mdx
  • website/i18n/fr/docusaurus-plugin-content-pages/compare/openscreen-vs-cap.mdx
  • website/i18n/fr/docusaurus-plugin-content-pages/compare/openscreen-vs-obs.mdx
  • website/i18n/fr/docusaurus-plugin-content-pages/features/auto-zoom.mdx
  • website/i18n/fr/docusaurus-plugin-content-pages/screen-recorder-linux.mdx
  • website/i18n/fr/docusaurus-plugin-content-pages/screen-recorder-mac.mdx
  • website/i18n/fr/docusaurus-plugin-content-pages/screen-recorder-windows.mdx
  • website/i18n/ja/code.json
  • website/i18n/ja/docusaurus-plugin-content-docs/current/ai-editing.md
  • website/i18n/ja/docusaurus-plugin-content-docs/current/cli.md
  • website/i18n/ja/docusaurus-plugin-content-docs/current/editing-timeline.md
  • website/i18n/ja/docusaurus-plugin-content-docs/current/export.md
  • website/i18n/ja/docusaurus-plugin-content-docs/current/faq.md
  • website/i18n/ja/docusaurus-plugin-content-docs/current/guides/product-demo-video.md
  • website/i18n/ja/docusaurus-plugin-content-docs/current/installation.md
  • website/i18n/ja/docusaurus-plugin-content-docs/current/intro.md
  • website/i18n/ja/docusaurus-plugin-content-docs/current/quick-start.md
  • website/i18n/ja/docusaurus-plugin-content-docs/current/recording.md
  • website/i18n/ja/docusaurus-plugin-content-pages/alternatives/camtasia.mdx
  • website/i18n/ja/docusaurus-plugin-content-pages/alternatives/loom.mdx
  • website/i18n/ja/docusaurus-plugin-content-pages/alternatives/screen-studio.mdx
  • website/i18n/ja/docusaurus-plugin-content-pages/compare/openscreen-vs-cap.mdx
  • website/i18n/ja/docusaurus-plugin-content-pages/compare/openscreen-vs-obs.mdx
  • website/i18n/ja/docusaurus-plugin-content-pages/features/auto-zoom.mdx
  • website/i18n/ja/docusaurus-plugin-content-pages/screen-recorder-linux.mdx
  • website/i18n/ja/docusaurus-plugin-content-pages/screen-recorder-mac.mdx
  • website/i18n/ja/docusaurus-plugin-content-pages/screen-recorder-windows.mdx
  • website/i18n/pt-BR/code.json
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/ai-editing.md
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/cli.md
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/editing-timeline.md
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/export.md
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/faq.md
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/guides/product-demo-video.md
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/installation.md
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/intro.md
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/quick-start.md
  • website/i18n/pt-BR/docusaurus-plugin-content-docs/current/recording.md
  • website/i18n/pt-BR/docusaurus-plugin-content-pages/alternatives/camtasia.mdx
  • website/i18n/pt-BR/docusaurus-plugin-content-pages/alternatives/loom.mdx
  • website/i18n/pt-BR/docusaurus-plugin-content-pages/alternatives/screen-studio.mdx
  • website/i18n/pt-BR/docusaurus-plugin-content-pages/compare/openscreen-vs-cap.mdx
  • website/i18n/pt-BR/docusaurus-plugin-content-pages/compare/openscreen-vs-obs.mdx
  • website/i18n/pt-BR/docusaurus-plugin-content-pages/features/auto-zoom.mdx
  • website/i18n/pt-BR/docusaurus-plugin-content-pages/screen-recorder-linux.mdx
  • website/i18n/pt-BR/docusaurus-plugin-content-pages/screen-recorder-mac.mdx
  • website/i18n/pt-BR/docusaurus-plugin-content-pages/screen-recorder-windows.mdx
  • website/i18n/zh-CN/code.json
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/ai-editing.md
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/cli.md
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/editing-timeline.md
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/export.md
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/faq.md
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/guides/product-demo-video.md
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/installation.md
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/intro.md
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/quick-start.md
  • website/i18n/zh-CN/docusaurus-plugin-content-docs/current/recording.md
  • website/i18n/zh-CN/docusaurus-plugin-content-pages/alternatives/camtasia.mdx
  • website/i18n/zh-CN/docusaurus-plugin-content-pages/alternatives/loom.mdx
  • website/i18n/zh-CN/docusaurus-plugin-content-pages/alternatives/screen-studio.mdx
  • website/i18n/zh-CN/docusaurus-plugin-content-pages/compare/openscreen-vs-cap.mdx
  • website/i18n/zh-CN/docusaurus-plugin-content-pages/compare/openscreen-vs-obs.mdx
  • website/i18n/zh-CN/docusaurus-plugin-content-pages/features/auto-zoom.mdx
  • website/i18n/zh-CN/docusaurus-plugin-content-pages/screen-recorder-linux.mdx
  • website/i18n/zh-CN/docusaurus-plugin-content-pages/screen-recorder-mac.mdx
  • website/i18n/zh-CN/docusaurus-plugin-content-pages/screen-recorder-windows.mdx
  • website/i18n/zh-TW/code.json
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/ai-editing.md
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/cli.md
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/editing-timeline.md
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/export.md
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/faq.md
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/guides/product-demo-video.md
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/installation.md
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/intro.md
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/quick-start.md
  • website/i18n/zh-TW/docusaurus-plugin-content-docs/current/recording.md
  • website/i18n/zh-TW/docusaurus-plugin-content-pages/alternatives/camtasia.mdx
  • website/i18n/zh-TW/docusaurus-plugin-content-pages/alternatives/loom.mdx
  • website/i18n/zh-TW/docusaurus-plugin-content-pages/alternatives/screen-studio.mdx
  • website/i18n/zh-TW/docusaurus-plugin-content-pages/compare/openscreen-vs-cap.mdx
  • website/i18n/zh-TW/docusaurus-plugin-content-pages/compare/openscreen-vs-obs.mdx
  • website/i18n/zh-TW/docusaurus-plugin-content-pages/features/auto-zoom.mdx
  • website/i18n/zh-TW/docusaurus-plugin-content-pages/screen-recorder-linux.mdx
  • website/i18n/zh-TW/docusaurus-plugin-content-pages/screen-recorder-mac.mdx
  • website/i18n/zh-TW/docusaurus-plugin-content-pages/screen-recorder-windows.mdx
  • website/scripts/gen-recreation.mjs
  • website/src/components/Recreation/ART-DIRECTION.md
  • website/src/components/Recreation/driver.ts
  • website/src/components/Recreation/generated.ts
  • website/src/components/Recreation/index.tsx
  • website/src/components/Recreation/scene.ts
  • website/src/components/Recreation/styles.module.css
  • website/src/components/Showcase/content.ts
  • website/src/components/Showcase/panels.tsx
  • website/src/components/Showcase/styles.module.css
  • website/src/pages/alternatives/camtasia.mdx
  • website/src/pages/alternatives/loom.mdx
  • website/src/pages/alternatives/screen-studio.mdx
  • website/src/pages/compare/openscreen-vs-cap.mdx
  • website/src/pages/compare/openscreen-vs-obs.mdx
  • website/src/pages/download.tsx
  • website/src/pages/features/auto-zoom.mdx
  • website/src/pages/screen-recorder-linux.mdx
  • website/src/pages/screen-recorder-mac.mdx
  • website/src/pages/screen-recorder-windows.mdx
  • website/static/llms.txt
  • workbench/l1/end-to-end.wb.ts
  • workbench/lib/editorial.ts
  • workbench/lib/fixtures.ts
  • workbench/scenarios/cursor-question.scn.ts
  • workbench/scenarios/real-screencast.scn.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@EtienneLescot
EtienneLescot force-pushed the integration/demo-never-ugly branch from 33a94d8 to 1b904b2 Compare September 26, 2026 08:15
@EtienneLescot

Copy link
Copy Markdown
Collaborator Author

Rebuilt on the current main (4e00f0a) from the latest head of every PR, review fixes included: 45 commits.

Local checks on Windows are green:

  • both tsc configs, lint and i18n:check;
  • vitest: 269 files, 3472 tests passed, 5 skipped;
  • cargo check -p openscreen-compositor --tests.

New conflicts resolved here:

🤖 Generated with Claude Code

@EtienneLescot

Copy link
Copy Markdown
Collaborator Author

@Beetix @My-Denia
this is a big one ;-)
I will soon merge this in main.
Wether it is still open or already merged when you read this, I just wanted to let you know that a bit of e2e testing on your sides would be very welcome ;-)

@My-Denia

Copy link
Copy Markdown
Collaborator

Tested the integration on Windows and everything I exercised looked good overall, except for one export-state issue: with a 640×360 source, README GIF requests 852×480 when selected directly but 640×360 after Studio → README GIF because the hidden MP4 quality state still affects GIF sizing.

@EtienneLescot

Copy link
Copy Markdown
Collaborator Author

Thanks @My-Denia, good catch. Fixed in b809227 (#861): a GIF is now sized from the source, then capped by the GIF size preset, so the hidden MP4 quality no longer changes it. README GIF on a 640×360 source gives 640×360 whichever way you pick it.

NoahSeeger and others added 27 commits September 27, 2026 19:13
…click's impact

The recorded visibility now gates `plan_cursor` itself, which every backend
and drawing path goes through: flat sprite, 3D model and its shadow, click
rings, motion-blur trail. It no longer gates `cursor_alpha`, which also
weights the click impact on the screen plane: a visible click whose pointer
an app hides on the next tick (dragging a numeric field) snapped the tilted
screen back from ~1.8 degrees in one frame. Clicks made while hidden are
still dropped at load.

The trail no longer samples a hidden phase: on the first frame after the
pointer reappeared it drew up to 16 copies from where it had been hidden.

`cursor.rs` is back to rustfmt-clean.
…indow

The Windows and macOS samplers fold a release into the press sample when
both land in one tick, so a quick tap has no mouse-up even in a take that
records them. It stayed "pressed" until the next click, and any later
hidden sample (typing, leaving the display) dropped it from the
suggestions. A press ended by its mouse-up is judged over the whole press;
one without is judged by the 150 ms grace, as PipeWire takes already were.
A mouse-up sample's own visibility no longer counts: it is sampled after
the release.
…erspective

81a0918 sizes the 3D cursor to its flat size at the zoom focus under a
fixed angle, where the iso plane's containment shrink used to make it ~18%
smaller. Its Windows render test was updated for that, but the Linux and
macOS twins of every_modelled_state_keeps_its_art_footprint_and_shadow
still required that shrink (tilted body < 0.9 of the flat one) and failed on
all six states. Both CI jobs have been red since, and cargo stopped before
the integration tests and the napi build.

The change is intended (commit message, updated render test and the new
a_fixed_angle_keeps_the_cursor_size_at_the_zoom_focus unit test), so the
test changes, not the code. It now checks what the plane still does to the
model: at the focus, it keeps its flat size (0.85 to 1.15 of the body);
away from it, the plane's perspective makes it bigger on the near side than
on the far side (x1.47 to x1.57 on lavapipe, x1.0 to x1.1 for a model left
facing the camera). Checked on lavapipe against three mutations, each
failing all six states: model posed front-on on the same tip, model
rotation dropped, focus size compensation removed.
…rner

A toast could only be waited out. That is fine for a confirmation and wrong for
an error: the 3s timer retires a long description before it has been read, and a
run of failures stacks over the editor with nothing to clear it.

Sonner ships a close button, so the work is where it puts one. Its default is the
START side — top-LEFT in a left-to-right UI — and half outside the box, hanging
off the corner like a badge. Nothing else here closes there: every dialog, pane
and inspector puts its cross inside the top end corner, and a dismiss control
that moves with the surface is one the eye has to hunt for.

Three things had to move together, which is why this is a stylesheet block rather
than one prop:

- the side, through sonner's own custom properties;
- the overhang, by dropping its `translate(35%, -35%)`;
- `top`, which sonner hardcodes to 0 instead of exposing as a variable, so it
  takes a rule on the element.

Flipped per direction rather than hard-coded to `right`. `ar` ships today and the
app does not set `dir` yet — this must not be the thing that breaks when it does.
The leading `html` in each selector is load-bearing too: sonner injects its
stylesheet at runtime, after ours, so an override of equal specificity would lose
on source order.

Inside the box, sonner's bordered opaque chip stops making sense — it reads as a
second surface floating on the toast — so the button is a plain icon that only
gains weight on hover, and the toast reserves `padding-inline-end` so a long
title cannot run under it.

The label comes from our own strings: sonner's default is an untranslated
"Close toast", and the rest of the app speaks 13 languages.

The tests pin what jsdom can actually see — the button exists, and it carries the
localized label — plus the three custom properties the placement rests on, in
sonner's stylesheet and ours. That last one is the real guard: on an upgrade that
renames them the override silently stops applying, the cross goes back to the top
left, and every other test stays green.

Also drops an unused `fireEvent` import in RightPanes.i18n.test.tsx that was
failing this branch's "Typecheck (tests)" job.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The override clears sonner's chip border with `border-color: transparent`, but
only at rest. Sonner's dark hover rule,
`[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover`,
is (0,5,0), which beats the base override's (0,4,1), and it sets
`border-color: var(--normal-border-hover)`. So the ring the override exists to
remove came back under the pointer, around a cross that has no border at rest.

The hover rule already outranks sonner at (0,5,1) and reset only the
background; it now resets the border too.

Checked in a browser against sonner's injected stylesheet: the hovered border
was rgb(64 64 64) before, transparent after. A contract test pins the reset in
both rules.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ction

Background is a section of Composition with its Animation row and a blur
amount; shadow and click bounce are named levels; settings are free rows;
cursor size shows no number. The timeline wears the app's candy cards: the
clip in the brand's green with its real waveform, zooms in blue. The
generator lifts the levels and bounds from the app, as before.
ChoiceRow for fixed choices, named levels, free rows, no hint text under
settings, candy timeline pills with the clip in green and zooms in blue.
tokens/v4.css re-exports the app's tokens verbatim again.
The showcase's export panel shows the named destinations and Advanced, and
the caption display language is a row of buttons. The docs name the 3D
camera, the speed preset row, the cursor settings, the export destinations
and the background animation and blur.
…de and auto zoom page

The product demo guide still listed speed presets from 0.25x to 5x and a
field up to 100x, and the auto zoom page still called the 3D camera a tilt.
Both fixed in every locale.
The editor places automatic zooms on every fresh take (#664), and #822
brought back "Auto-zoom after recording" in Record mode to turn it off.
The site still said nothing is added until you run Auto-enhance.

- Auto zoom page: intro, the after-take bullet with where to turn it
  off, and Getting started step 4.
- Auto zoom page: --auto-zoom zooms last two seconds, as in the editor
  (the CLI took the editor's path in 6cf4e73), not 1 s or 5%.
- Demo guide step 4 and the Getting started step of the seven comparison
  and platform pages: the first take opens with its zooms placed, rather
  than asking the reader to run a menu that now finds no room.
- All seven locales, with the app's own labels (English ones in German,
  per TRANSLATING.md).
Since the pages were translated (f4cc9f8), fourteen of them were a
U+0001 control character after the narrow no-break space, so the French
site showed no punctuation there. Twelve end a question, two were
semicolons, as in the English.
…ff canvas

Two defects in the tilted framed-screen trail (mode 18), reported on #814.

The bilinear quad_inverse returned (0,0,0) for a pixel with no preimage,
past the warp's fold. Mode 18 took it for a plane point and quad_forward
sent it to the screen's top-left corner: far background took that corner's
colour, masked marker included. The inverse now flags it (ok = -1, apart
from ok = 0, solved but outside the quad, which frame and shadow trails
need). Mode 18 skips the tap; mode 8's per-pixel trail keeps its sharp
sample. Callers testing ok < 0.5 are unchanged.

Off-canvas taps re-read raw footage. They now sample it like mode 8, with
its depth-of-field mb and camera lamp, and the pyramid gets its own slot
(t5, binding 6, texture(5)) since mode 18 keeps slot 2 for its isolated
render. Mode 8 and flat trails render byte-identical.

D3D11 and lavapipe: far-background leak 354,205 px -> 0; normal vs padded
canvas edge diff 89 -> 5. Metal mirrored, not compiled here.
AGENTS.md: the HUD's control row, the tray menu, the record-to-edit
flow and Record mode as the v2 app has them, the grant for an
installed build, and a pointer to running the pass on a CI artifact.

Checklist: a section on getting, installing and launching each CI
artifact, with where a packaged build logs. Checks rewritten where the
v2 editor moved or dropped the control they named (top bar, transport,
inspector, export dialog, clip and crop dialog, captions, autosave),
and new checks for Record mode, automatic zooms after a take, the
macOS permissions window and Apple's picker. The results log is
untouched.
build.yml has built both macOS architectures on every run since the flag was lifted; the note still told readers the path is only exercised locally.
The macOS section still sent users to System Settings to grant Screen
Recording and Accessibility by hand, and warned that macOS 15+ re-asks.

- First launch opens the permissions window; it reopens from the menu
  bar icon (Permissions…).
- macOS 15.2+: Apple's picker needs no Screen Recording; system audio
  asks for System Audio Recording Only.
- macOS 13 to 15.1: own picker, Screen Recording covers system audio;
  the periodic alert is stated for 15.0 and 15.1 only.
- Requirements: microphone needs macOS 15, recommended 15.2.
- Same update in the 7 translations.
A take's first zoom was clamped to 0 s, so the video opened already zoomed
in: 62% of 146 real takes did. The click on the HUD's Stop button zoomed the
last second onto a button the video never shows: 47% ended that way.

No automatic zoom now starts moving in before 2.5 s into the edit, or is still
zooming out in its last second, and a click in the recording's last second is
ignored. A zoom those bounds push off its own moment is dropped. The bounds
belong to the edit: a cut may still land on a zoom.
…lick

The pointer usually rests on the HUD's Stop button before the click. That still run is a dwell, and when another clip follows the take, the edit's own ending does not reach it, so it zoomed onto a button the video never shows. A dwell whose run holds an ignored click now goes with it.
One zoom per event made the camera come and go every 6 to 8 seconds: 7.6
zooms a minute on real demos, a fifth of them straight back in after
zooming out, and pans at full zoom toward a point off screen.

Zooms are now planned from clicks only, like Screen Studio, Cap and Tella:
a still pointer says little about where the viewer looks. Clicks close in
time that fit in one zoom share it; a zoom is in half a second before its
first click and holds 1.5 s after its last; its depth, 1.25x to 1.8x, is
the deepest that keeps its clicks in view. Two zooms keep at least 1.5 s
of wide shot between them, or merge, or the lighter one goes, over the
whole timeline and against the zooms already on it.

Replayed on the 11 real demos over a minute: 7.6 -> 2.1 zooms a minute,
no yo-yo, no blind pan, and the same 84% of clicks seen zoomed.
…ocale

The auto-zoom page described the old pause detector: pauses of half a
second to 2.6 seconds, two-second zooms at 1.8x, and no click data needed.
It now describes the shot planner, and the CLI, timeline and demo-guide
docs, the comparison and alternative pages and llms.txt say the zooms
follow the recorded clicks. Same change in all seven translations.
Review of #873: the comparison tables and two intros still said zooms come from the recorded cursor, against the updated text on the same page. The demo guide now says clicks share a zoom only when they fit in it together, and that a zoom too close to one already placed also blocks a new one. The auto-zoom page says a zoom shifts or drops near the end of a clip. Same change in all seven translations.
…the frame

The corner radius followed the camera's eased position, which covers 90% of the way in the first third of the lead-in: the corners were square for most of the growth and only rounded again at the very end of the return. The PiP bubble (corners and shadow) now runs on the linear phase of the transition: it holds through the first half of the lead-in and comes back in the first half of the lead-out.
The section that kept German docs on English interface labels waited for
a release with the German interface. Releases ship it now, so German
follows the same rule as every other locale.
Pages still sent Mac users to System Settings for Screen Recording and
Accessibility before the first take. v2 opens a permissions window on
first launch, and from macOS 15.2 the source is picked in Apple's
system picker, with no Screen Recording grant.

- Getting-started steps, the Mac page and the download footnote point
  at the permissions window.
- Mac page: system audio asks for its own permission from 15.2, and
  Screen Recording covers it before that.
- Quick start, Recording and the demo guide name Apple's picker on
  15.2+; the Accessibility prompt is now the permissions window.
- Same update in the 7 translations. German sections touched here use
  the app's German labels, which also carries over Recording's pending
  Share → Select and Rec → Record renames.
- cli.md unchanged: `record` still enumerates sources, so it needs
  Screen Recording.
@EtienneLescot
EtienneLescot force-pushed the integration/demo-never-ugly branch from 19eb252 to e8b51be Compare September 27, 2026 17:13
@EtienneLescot
EtienneLescot merged commit e8b51be into main Sep 27, 2026
22 checks passed

This branch was successfully deployed

1 active deployment
github-pages — e8b51be2 Deployed Sep 27, 2026 by EtienneLescot via Deploy to GitHub Pages #275
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants