Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
5b83234
design: import OpenScreen design system assets, titlebar & brand mark
EtienneLescot Jun 27, 2026
f57bfe9
feat(ai-edition): bootstrap the v3 editor model and full editor shell…
EtienneLescot Jun 25, 2026
70ebdde
fix(recording): resolve 0-byte-recording regressions
Jun 30, 2026
d5e6ac1
fix(ai-edition/preview): scrub thumb stuck at 0% with an empty timeline
Jun 30, 2026
caf7ac0
feat(ai-edition): multi-session chat history + multi-clip timeline wi…
EtienneLescot Jul 1, 2026
16941f4
feat(ai-edition): timeline interaction P0 — clip resize/delete/duplic…
EtienneLescot Jul 1, 2026
655cf1d
feat(ai-edition): timeline viewport spine — pan/zoom/reorder (T01-T09)
EtienneLescot Jul 1, 2026
1927a15
feat(ai-edition): timeline lanes, navigator strip, Place-skip mode (T…
EtienneLescot Jul 1, 2026
757347f
feat(ai-edition): timeline polish — scrub preview, resequence, snap g…
EtienneLescot Jul 1, 2026
f3683d6
feat(ai-edition): agent tool runtime + inspector/export polish (P1, F…
EtienneLescot Jul 2, 2026
26aa561
fix(electron): don't crash main process on EPIPE/ECONNRESET
EtienneLescot Jul 2, 2026
bcdead3
test(ai-edition): Playwright + computer-use e2e coverage for the editor
EtienneLescot Jul 2, 2026
10e8490
feat(ai-edition/llm): provider/reasoning parity, SSE streaming, conte…
EtienneLescot Jul 2, 2026
717a4fe
feat(ai-edition): wire zoom/annotation/speed regions into the live pr…
EtienneLescot Jul 2, 2026
3cd0fd7
feat(ai-edition): cursor pipeline, region lanes, preview aspect-ratio…
EtienneLescot Jul 2, 2026
24e9a3f
feat(ai-edition): provider model discovery + browser-shim LLM state p…
EtienneLescot Jul 2, 2026
ff69c78
feat(ai-edition): source transcript modal reshape + per-asset regener…
EtienneLescot Jul 3, 2026
2a044b7
feat(ai-edition): port axcut's deepagents runtime; per-message rewind…
EtienneLescot Jul 3, 2026
0708226
feat(ai-edition): Whisper language plumbing + inline session rename
EtienneLescot Jul 3, 2026
b715f49
fix(launch): drop HUD bar drop shadow halo
EtienneLescot Jul 3, 2026
9c53e06
feat(ai-edition): aggregated transcript pane + chat layout fixes + ag…
EtienneLescot Jul 3, 2026
e897f9b
feat(ai-edition): editable right-pane transcript via skip-range model…
EtienneLescot Jul 3, 2026
3e33efb
fix(ai-edition): chat input styling + move transport bar into timelin…
EtienneLescot Jul 4, 2026
27b752e
refactor(ai-edition): extract PreviewCompositor/playback-clock; per-a…
EtienneLescot Jul 4, 2026
7ce342f
feat(stt): migrate captioning to native whisper.cpp + forced alignmen…
EtienneLescot Jul 3, 2026
63150e9
feat(stt): migrate STT engine to CTranslate2 (HTTP inference, alignme…
EtienneLescot Jul 5, 2026
38cbe22
fix(ai-edition): fall back to VirtualPreview for the screen stage
EtienneLescot Jul 6, 2026
eee85bb
fix(stt/ct2-build): MSVC decoding crash patch + long-recording chunki…
EtienneLescot Jul 6, 2026
40412b3
feat(stt): migrate STT engine from CTranslate2 to whisper.cpp with DT…
EtienneLescot Jul 7, 2026
40bff23
fix(ci): repair and stabilize the whisper-stt build workflow
EtienneLescot Jul 8, 2026
b442705
fix: resolve leftover merge-conflict markers and regenerate lockfile …
EtienneLescot Jul 8, 2026
5a4d35b
fix(ai-edition): probe MiniMax model slugs at the OpenAI-compat sibling
EtienneLescot Jul 8, 2026
3392d98
fix(ai-edition): fix MiniMax empty-response bug and wire up thinking …
EtienneLescot Jul 8, 2026
60b9cb1
feat(ai-edition): refactor editor to OpenScreen Editor v4 (Media/Edit…
EtienneLescot Jul 9, 2026
b9864a6
style(ai-edition): flatten timeline region pills to v4 design
EtienneLescot Jul 9, 2026
aa10396
style(ai-edition): match v4 timeline navigator to design
EtienneLescot Jul 9, 2026
7d1f9ef
style(ai-edition): align v4 timeline clip cards + ruler to design
EtienneLescot Jul 9, 2026
e6c0fdf
fix(ai-edition): hide timeline lane watermark when lane has regions
EtienneLescot Jul 9, 2026
fd0c593
style(ai-edition): float clip label as v4 blur chip over waveform
EtienneLescot Jul 9, 2026
5ec4d6a
docs(ai-edition): add v4 design-parity + import audit notes
EtienneLescot Jul 9, 2026
b5f8f53
feat(ai-edition): rebuild timeline from the v4 design (V4Timeline)
EtienneLescot Jul 9, 2026
060fd28
feat(ai-edition): restore region resize / multi-select / aspect in V4…
EtienneLescot Jul 9, 2026
fa13503
feat(ai-edition): fold edit-clip / place-skip / snap into V4Timeline
EtienneLescot Jul 9, 2026
40263cb
design: import OpenScreen Design System from claude.ai/design
EtienneLescot Jul 8, 2026
99cc34b
fix(recording): sync webcam to native capture instead of racing a bro…
EtienneLescot Jul 9, 2026
379fb93
fix(recording): compensate webcam start-time offset on native macOS r…
EtienneLescot Jul 9, 2026
0260b4b
feat(docs): scaffold Docusaurus 3 site + GitHub Pages CI
EtienneLescot Jun 25, 2026
a7735af
style(website): biome auto-format for cce4524 website scaffold
EtienneLescot Jun 26, 2026
cb54ea7
ci(docs): pin actions to commit SHAs in docs.yml
EtienneLescot Jun 26, 2026
c6b6ce9
feat(docs): implement OpenScreen Design System landing + docs theme
EtienneLescot Jul 9, 2026
d1287fd
feat(docs): write feature documentation grounded in the shipped editor
EtienneLescot Jul 9, 2026
a9a5150
fix(docs): address CodeRabbit review comments from PR #39
EtienneLescot Jul 9, 2026
7f48ce0
fix(ai-edition): fit video preview to its container and add inspector…
EtienneLescot Jul 10, 2026
7040e20
feat(ai-edition): unify trim/effect model, ventilate on reorder, add …
EtienneLescot Jul 10, 2026
7059a2b
feat(ai-edition): per-clip crop export, HUD/RecStage redesign, theme …
EtienneLescot Jul 11, 2026
88d9536
feat(ai-edition): pixel-perfect widget redesign, real waveforms, crop…
EtienneLescot Jul 11, 2026
7aef2ee
feat(ai-edition): export UX, chat/timeline fixes, unify project files…
EtienneLescot Jul 12, 2026
3b488f6
fix(ai-edition): force crop ratio presets to their exact aspect ratio
EtienneLescot Jul 12, 2026
3842391
fix(ai-edition): timeline overflow, ruler/playhead redesign, scrollba…
EtienneLescot Jul 12, 2026
99f545c
feat(ai-edition): export sizes to largest clip + timeline aspect; add…
EtienneLescot Jul 15, 2026
719aaab
fix(rebase): reconcile main's recording fixes into the v4 recording path
EtienneLescot Jul 15, 2026
b14072c
feat(ai-edition): re-port custom gradient editor into v4 background pane
EtienneLescot Jul 15, 2026
34befdc
feat(ai-edition): wire the native File menu to v4 actions
EtienneLescot Jul 15, 2026
70bb512
feat(ai-edition): complete the 100x playback-speed path in v4
EtienneLescot Jul 15, 2026
f1ceaa5
feat(ai-edition): apply Full Camera regions on the v4 export path
EtienneLescot Jul 15, 2026
6bebff2
feat(ai-edition): make Full Camera a first-class v4 timeline region
EtienneLescot Jul 15, 2026
a159121
ci(whisper-stt): scope the build cache to the runner image version
EtienneLescot Jul 15, 2026
10ddd59
feat(ai-edition): add RenderPlan multi-asset export data model + builder
EtienneLescot Jul 15, 2026
fb84874
feat(ai-edition): add audio-concat planner for v2 multi-asset export
EtienneLescot Jul 15, 2026
4b0b75a
feat(ai-edition): make cursor a first-class per-segment part of the R…
EtienneLescot Jul 15, 2026
2422cca
feat(ai-edition): thread the RenderPlan through documentExporter → Vi…
EtienneLescot Jul 15, 2026
9ea84b6
feat(ai-edition): render multi-asset timelines via the v2 segment loo…
EtienneLescot Jul 15, 2026
cdbecd1
feat(ai-edition): render per-segment webcam overlay + cursor in the s…
EtienneLescot Jul 15, 2026
cd1872c
feat(ai-edition): add audio concat PCM assembler with equal-power bou…
EtienneLescot Jul 15, 2026
6a5bf19
feat(ai-edition): wire per-segment audio into the v2 segment loop
EtienneLescot Jul 15, 2026
fe5d540
feat(ai-edition): apply timeline speed in the segment loop (video + e…
EtienneLescot Jul 15, 2026
e7c81d9
fix(ai-edition): time-stretch segment audio PER speed sub-segment, no…
EtienneLescot Jul 15, 2026
8286f3d
refactor(ai-edition): route ALL AI-edition exports through the segmen…
EtienneLescot Jul 15, 2026
8036a59
feat(exporter): add StageTimings perf accumulator for the Phase-0 har…
EtienneLescot Jul 15, 2026
a31cf49
perf(exporter): GPU-resident composite path + hardware-first encode
EtienneLescot Jul 16, 2026
6177c16
chore(exporter): log the renderer's real WebGL vendor/renderer in the…
EtienneLescot Jul 16, 2026
09db50f
perf(exporter): overlap the WSOLA audio stretch with the video loop
Jul 16, 2026
e6cbb45
revert(exporter): drop the GPU-resident composite path
EtienneLescot Jul 16, 2026
b66af5c
docs(export-v2): rewrite the D4 perf programme around native ffmpeg e…
EtienneLescot Jul 16, 2026
1898d6f
docs(export-v2): bundle size is not a constraint (~200MB/platform is …
EtienneLescot Jul 16, 2026
7cad2cf
docs(export-v2): measure the upstream chain - IPC is the bottleneck, …
EtienneLescot Jul 16, 2026
928bbaa
docs(export-v2): measure the crossing end-to-end - 34 fps BGRA, 81 fp…
EtienneLescot Jul 16, 2026
c8a4482
feat(export): ffmpeg capability detection (binary path, encoder pick,…
EtienneLescot Jul 16, 2026
1cc18aa
docs(native-core): spec the Rust/wgpu compositor option (the 20x path)
EtienneLescot Jul 16, 2026
87e3b3d
docs(native-core): add option A' (sandbox:false) and price C honestly…
EtienneLescot Jul 16, 2026
b672506
docs(native-core): "going native" relocates the security problem, it …
EtienneLescot Jul 16, 2026
948746d
docs(export-v2): native encode ships on all three platforms - no macO…
EtienneLescot Jul 16, 2026
3de83da
feat(export): ffmpeg encode session - stream frames to a native encoder
EtienneLescot Jul 16, 2026
46d6a51
build(export): vendor a pinned LGPL ffmpeg for the native encoder
EtienneLescot Jul 16, 2026
d00e4fe
feat(export): let ffmpeg mux the audio, so it writes the final file
EtienneLescot Jul 16, 2026
37e6694
fix(export): prove the encoder works instead of inferring it from -en…
EtienneLescot Jul 16, 2026
ca530a7
feat(export): main-process service + IPC for the native encoder
EtienneLescot Jul 16, 2026
6d521c5
feat(bench): headless export bench, and the measurement that kills op…
EtienneLescot Jul 16, 2026
f0d20b6
docs(export): research report — native encode fed from the renderer c…
EtienneLescot Jul 16, 2026
d022036
feat(bench): readback-ceiling arm — option A' is excluded by measurement
EtienneLescot Jul 16, 2026
75b6328
perf(export): stop rebuilding per frame what never changes — the wall…
EtienneLescot Jul 17, 2026
b8659a1
perf(export): cache the drop shadow — it never depended on the video
EtienneLescot Jul 17, 2026
558e7d8
perf(export): blur the wallpaper once, not 1418 times
EtienneLescot Jul 17, 2026
4c2f842
docs(export): one document, and it says what the measurements say
EtienneLescot Jul 17, 2026
707fccd
feat: AI Editionに編集可能なカーソル軌道を追加
YoneRai12 Jul 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
199 changes: 199 additions & 0 deletions .github/workflows/build-whisper-stt.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
name: Build whisper-stt binaries

# Builds the whisper.cpp-based `whisper-stt-server` helper for each desktop
# platform and uploads the binary + ggml backend sidecars as GitHub artifacts
# so `build.yml` can bundle them into installers.
#
# Triggered:
# * manually via workflow_dispatch (release-blocking binary refresh)
# * automatically when the helper, build script, or this workflow changes
#
# ponytail: one binary per platform is enough because whisper.cpp selects the
# right backend at runtime (Metal on Apple Silicon, Vulkan on Windows/Linux,
# CPU fallback when no GPU/driver is available). A CUDA variant is supported
# by the build script but is not built by default; Vulkan already accelerates
# NVIDIA cards.

on:
workflow_dispatch:
inputs:
enable_cuda:
description: "Also build a CUDA variant when the host has an nvcc toolchain"
required: false
default: "false"
type: choice
options:
- "true"
- "false"
push:
paths:
- "scripts/build-whisper-stt.sh"
- "electron/native/whisper-stt/**"
- ".github/workflows/build-whisper-stt.yml"

permissions:
contents: read

jobs:
build:
name: ${{ matrix.label }}
strategy:
fail-fast: false
matrix:
include:
- os: macos-latest
arch: arm64
# Matches `os_arch_tag()` in scripts/build-whisper-stt.sh — this is
# the directory name the build script actually stages into
# (electron/native/bin/<tag>/), NOT `${{ matrix.os }}-${{ matrix.arch }}`.
tag: darwin-arm64
label: macOS arm64 (Metal)
vulkan: false
- os: macos-15-intel
arch: x64
tag: darwin-x64
label: macOS x64 (CPU)
vulkan: false
- os: ubuntu-latest
arch: x64
tag: linux-x64
label: Linux x64 (Vulkan + CPU fallback)
vulkan: true
- os: windows-latest
arch: x64
tag: win32-x64
label: Windows x64 (Vulkan + CPU fallback)
vulkan: true
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: ./.github/actions/setup

- name: Install Ninja (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y ninja-build build-essential

- name: Install Ninja (macOS)
if: startsWith(matrix.os, 'macos')
run: brew install ninja

- name: Setup MSVC (Windows)
if: matrix.os == 'windows-latest'
uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64

- name: Install Vulkan SDK
if: matrix.vulkan
# ponytail: humbletim/setup-vulkan-sdk builds Glslang from source via
# CMake ExternalProject, which fails ("ENABLE_OPT set but SPIR-V
# tools not found") because Glslang's build needs a sibling
# SPIRV-Tools checkout it doesn't fetch on its own — reproduced on
# both the Linux and Windows legs. jakoch/install-vulkan-sdk-action
# downloads LunarG's official prebuilt SDK (glslc included, no
# compilation), which is both more reliable and much faster.
uses: jakoch/install-vulkan-sdk-action@v1
with:
vulkan_version: 1.4.304.1
install_runtime: false
cache: true

- name: Put glslc on PATH
if: matrix.vulkan
shell: bash
# Belt-and-braces: the action exports VULKAN_SDK but its own PATH
# handling isn't documented in enough detail to rely on for a tool
# (glslc) the ggml Vulkan backend's CMake configure step needs to find.
run: |
set -euo pipefail
for cand in "${VULKAN_SDK}/Bin" "${VULKAN_SDK}/bin"; do
if [[ -d "${cand}" ]]; then
echo "${cand}" >> "$GITHUB_PATH"
fi
done

- name: Install SPIRV-Headers (Windows only)
if: matrix.os == 'windows-latest'
shell: bash
# ponytail: ggml-vulkan's CMakeLists does
# `find_package(SPIRV-Headers CONFIG REQUIRED)`. The Linux LunarG SDK
# tarball bundles that CMake config alongside the SDK, so the Linux
# leg resolves it for free; the Windows installer .exe (as fetched by
# jakoch/install-vulkan-sdk-action) does not ship it at all, so
# find_package fails with "Could not find a package configuration
# file". vcpkg (preinstalled on GitHub's windows-latest image) ships
# a spirv-headers port that provides the missing config; point
# CMAKE_PREFIX_PATH at its install dir so ggml's own
# `if (DEFINED ENV{VULKAN_SDK}) list(APPEND CMAKE_PREFIX_PATH ...)`
# logic has a second, working prefix to fall back to.
run: |
set -euo pipefail
VCPKG_ROOT_DIR="$(dirname "$(command -v vcpkg)")"
"${VCPKG_ROOT_DIR}/vcpkg" install spirv-headers:x64-windows
echo "CMAKE_PREFIX_PATH=${VCPKG_ROOT_DIR}/installed/x64-windows" >> "$GITHUB_ENV"

- name: Cache whisper.cpp build tree
uses: actions/cache@v4
with:
# Matches scripts/build-whisper-stt.sh's own BUILD_ROOT default for
# each OS (short `C:/wstbuild` on Windows to dodge the vulkan-shaders-gen
# MAX_PATH issue; `.cache/whisper-stt-build` elsewhere) — cache the
# FetchContent checkout + object files directly, no env override needed.
path: ${{ runner.os == 'Windows' && 'C:/wstbuild' || '.cache/whisper-stt-build' }}
# Keyed on the pinned WHISPER_REF/backend flags in CMakeLists.txt so a
# bump there invalidates the cache instead of silently reusing a stale
# FetchContent checkout; falls back to the newest cache for the same
# platform + runner image on a miss so incremental compilation still
# helps. The runner image version ($ImageOS/$ImageVersion) is part of
# the key AND the restore-keys prefix because CMake bakes absolute
# toolchain paths (e.g. the Xcode SDK's libz.tbd) into the cached build
# tree — when GitHub rolls the image's Xcode/SDK, those paths vanish and
# a restored tree fails with "No rule to make target …libz.tbd". Scoping
# the cache to the image version auto-busts it on every toolchain roll.
key: whisper-stt-build-${{ matrix.tag }}-${{ env.ImageOS }}-${{ env.ImageVersion }}-${{ hashFiles('electron/native/whisper-stt/CMakeLists.txt') }}
restore-keys: |
whisper-stt-build-${{ matrix.tag }}-${{ env.ImageOS }}-${{ env.ImageVersion }}-

- name: Run whisper-stt build script
env:
ENABLE_CUDA: ${{ github.event.inputs.enable_cuda || 'false' }}
run: bash scripts/build-whisper-stt.sh

- name: Stage binaries for upload
shell: bash
run: |
set -euo pipefail
BAG="whisper-stt-${{ matrix.tag }}"
mkdir -p "$BAG"
# Copy the whole per-platform directory: the helper executable plus
# every ggml backend sidecar/library it needs at runtime.
cp -v "electron/native/bin/${{ matrix.tag }}"/* "$BAG/"
tar -czf "${BAG}.tar.gz" "$BAG"
echo "Staged ${BAG}.tar.gz"

- name: Upload binaries
uses: actions/upload-artifact@v4
with:
name: whisper-stt-${{ matrix.tag }}
path: whisper-stt-${{ matrix.tag }}.tar.gz
if-no-files-found: error
retention-days: 30

- name: Workflow summary
if: always()
# Explicit shell: the bash `{ ... } >> file` grouping syntax below is
# not valid PowerShell, which is the default `run:` shell on Windows
# runners — this step silently failed on Windows without this.
shell: bash
run: |
{
echo "## whisper-stt build"
echo ""
echo "- Matrix: \`${{ matrix.label }}\`"
echo "- Result: ${{ job.status }}"
} >> "$GITHUB_STEP_SUMMARY"
Loading
Loading