Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
f16bf3c
design: import the OpenScreen design system — assets, titlebar and br…
EtienneLescot Jun 27, 2026
09da429
feat(editor): bootstrap the v3 editor model and shell, and make it th…
EtienneLescot Jun 25, 2026
8dd515f
fix(editor): 0-byte recordings, and a scrub thumb stuck at 0% on an e…
EtienneLescot Jun 30, 2026
ac55f2d
feat(timeline): build the multi-clip timeline — clips, viewport, lane…
EtienneLescot Jul 1, 2026
c64fbb5
feat(agent): agent tool runtime, with inspector and export polish
EtienneLescot Jul 2, 2026
1ab40a4
fix(electron): stop EPIPE/ECONNRESET from crashing the main process
EtienneLescot Jul 2, 2026
3c9e4f4
test(editor): Playwright and computer-use end-to-end coverage
EtienneLescot Jul 2, 2026
1f649b3
feat(llm): provider and reasoning parity, SSE streaming and context c…
EtienneLescot Jul 2, 2026
e77a25d
feat(preview): wire zoom, annotation and speed regions plus the curso…
EtienneLescot Jul 2, 2026
49dd0a6
feat(llm): discover provider models and persist LLM state
EtienneLescot Jul 2, 2026
01f62c2
feat(transcript): reshape the source transcript modal and wire per-as…
EtienneLescot Jul 3, 2026
c418b99
feat(agent): port axcut's deepagents runtime, with per-message rewind…
EtienneLescot Jul 3, 2026
8f4dd68
feat(stt): thread the Whisper language through, and rename sessions i…
EtienneLescot Jul 3, 2026
64cc906
fix(launch): drop the HUD bar's drop-shadow halo
EtienneLescot Jul 3, 2026
175262c
feat(transcript): an aggregated transcript pane, editable through a s…
EtienneLescot Jul 3, 2026
ae7bf59
refactor(editor): extract PreviewCompositor and the playback clock, a…
EtienneLescot Jul 4, 2026
67bbb43
feat(stt): move captioning to a native engine — whisper.cpp with alig…
EtienneLescot Jul 5, 2026
77f416c
fix(preview): fall back to VirtualPreview for the screen stage
EtienneLescot Jul 6, 2026
b4aa5e8
feat(stt): settle on whisper.cpp with DTW word timestamps, and stabil…
EtienneLescot Jul 8, 2026
aeb5e8a
fix: clear leftover merge-conflict markers and regenerate the lockfile
EtienneLescot Jul 8, 2026
545ae7b
fix(llm): find MiniMax's model slugs, fix its empty responses and wir…
EtienneLescot Jul 8, 2026
ce5be9f
fix(recording): sync the webcam to native capture and compensate its …
EtienneLescot Jul 9, 2026
8645f16
feat(docs): scaffold the Docusaurus site with its GitHub Pages CI
EtienneLescot Jun 26, 2026
018c84e
feat(editor): refactor to OpenScreen Editor v4 (Media/Edit/Rec) and m…
EtienneLescot Jul 9, 2026
d03b2dd
feat(timeline): rebuild the timeline from the v4 design (V4Timeline)
EtienneLescot Jul 9, 2026
a66fe2f
design: import the OpenScreen Design System
EtienneLescot Jul 8, 2026
4d4e11d
feat(docs): a design-system landing page and feature documentation gr…
EtienneLescot Jul 9, 2026
b51533a
fix(preview): fit the video to its container, with inspector-aware pa…
EtienneLescot Jul 10, 2026
9f6dd7f
feat(timeline): unify the trim/effect model, ventilate on reorder, an…
EtienneLescot Jul 10, 2026
dcf3bdd
feat(editor): per-clip crop export, HUD/RecStage redesign, real wavef…
EtienneLescot Jul 11, 2026
82fab4e
feat(editor): export UX, .openscreen project files, exact crop ratios…
EtienneLescot Jul 12, 2026
b61d7ff
feat(export): size exports to the largest clip and the timeline aspec…
EtienneLescot Jul 15, 2026
a1932e4
fix(recording): reconcile main's recording fixes into the v4 recordin…
EtienneLescot Jul 15, 2026
dc300ee
feat(editor): re-port gradients, the File menu, 100x speed and Full C…
EtienneLescot Jul 15, 2026
156dd5c
ci(whisper-stt): scope the build cache to the runner image version
EtienneLescot Jul 15, 2026
736da0c
feat(export): the RenderPlan data model and audio-concat planner, thr…
EtienneLescot Jul 15, 2026
04c763f
feat(export): render multi-asset timelines through the v2 segment loop
EtienneLescot Jul 15, 2026
a23e070
feat(export): apply timeline speed per sub-segment, and route every e…
EtienneLescot Jul 15, 2026
e13ddb9
perf(export): a StageTimings harness and hardware-first encode, with …
EtienneLescot Jul 16, 2026
2c52f74
docs(export-v2): measure the upstream chain — IPC is the bottleneck, …
EtienneLescot Jul 16, 2026
19e68c9
feat(export): detect ffmpeg's capabilities — binary path, encoder pic…
EtienneLescot Jul 16, 2026
1c9d201
docs(native-core): price the Rust/wgpu compositor against sandbox:fal…
EtienneLescot Jul 16, 2026
6822e50
feat(export): stream frames to a native ffmpeg encoder behind a main-…
EtienneLescot Jul 16, 2026
6c5012a
feat(bench): a headless export bench — the measurements that exclude …
EtienneLescot Jul 16, 2026
16ad52a
perf(export): stop rebuilding per frame what never changes — the wall…
EtienneLescot Jul 17, 2026
926ef10
docs(architecture): one export document, and the target rendering arc…
EtienneLescot Jul 17, 2026
59f1b45
feat(bench): gate G0 — fence the GPU before the encode timers, and ca…
EtienneLescot Jul 17, 2026
5ae4da8
fix(project): stop concurrent saves from splicing project files together
EtienneLescot Jul 17, 2026
4edf64c
feat(bench): price the shadow and the gaussians apart from the plumbing
EtienneLescot Jul 17, 2026
93a9a7f
feat(poc): a full-shader compositor POC, instrumented with honest GPU…
EtienneLescot Jul 17, 2026
0092f35
perf(poc): bake the background and cull what cannot be seen — 85 fps
EtienneLescot Jul 17, 2026
a15cf13
feat(poc): motion blur, a real cursor and an analytic Gaussian shadow…
EtienneLescot Jul 17, 2026
aad3daf
perf(poc): measure throughput, not the empty loop — and serialise the…
EtienneLescot Jul 17, 2026
f518c42
feat(poc-native): the WGSL compositor on native wgpu — pipe-bound at …
EtienneLescot Jul 17, 2026
0ea9fdc
feat(poc-native): CPU decode measured every way — the wall is CPU↔GPU…
EtienneLescot Jul 17, 2026
39fa6ab
feat(poc-native): zero-copy Vulkan decode via gpu-video, blocked only…
EtienneLescot Jul 17, 2026
7db7216
docs(architecture): D3D11 delivers GPU residency driver-free, and the…
EtienneLescot Jul 17, 2026
4147369
feat(poc-d3d): the native D3D11 compositor — the retained fast path
EtienneLescot Jul 17, 2026
44a0cf2
feat(poc-d3d): an interactive preview and export GUI
EtienneLescot Jul 18, 2026
b1a6fa2
feat(poc-d3d): embed the native view in the editor — library crate, n…
EtienneLescot Jul 18, 2026
1d8d79e
feat(poc-d3d): native export on the addon, non-blocking and wired to …
EtienneLescot Jul 18, 2026
e1ea936
feat(poc-d3d): typed inspector params, a param store, and sync on act…
EtienneLescot Jul 18, 2026
d638f7d
feat(poc-d3d): time-addressable rendering, with the app transport dri…
EtienneLescot Jul 18, 2026
5ff7f40
feat(poc-d3d): inspector effects on the native path, live recompose, …
EtienneLescot Jul 18, 2026
c236ce0
feat(poc-d3d): native multiclip export over the real timeline
EtienneLescot Jul 18, 2026
f43f587
feat(scene): the SceneDescription contract — app to native, with buil…
EtienneLescot Jul 18, 2026
19c5254
feat(poc-d3d): consume the scene in Rust — the layout preset drives t…
EtienneLescot Jul 18, 2026
be891b1
feat(poc-d3d): real backgrounds and a native cursor, with corrected p…
EtienneLescot Jul 18, 2026
40d9e92
feat(poc-d3d): zoom regions, full camera, export badges and native si…
EtienneLescot Jul 19, 2026
984786b
refactor(scene): make sceneDescription the single source of truth
EtienneLescot Jul 19, 2026
52b2759
chore: ignore the cc-delegate worktrees and drop its salvage snapshots
EtienneLescot Jul 19, 2026
f8cd520
feat(poc-d3d): speed regions and the native audio pipeline
EtienneLescot Jul 19, 2026
566a4f3
feat(preview): stream native frames to the canvas — offscreen render …
EtienneLescot Jul 19, 2026
03ec9f2
fix(preview): cursor overflow, the readback's COM interface, and odd …
EtienneLescot Jul 19, 2026
e8fee07
refactor(preview): remove the CPU and web fallbacks — one native path
EtienneLescot Jul 19, 2026
e6488e1
fix(preview): PiP duplication, doubled CSS shadows, the real camera a…
EtienneLescot Jul 20, 2026
b2e8db3
feat(export): report real native export progress to the UI
EtienneLescot Jul 20, 2026
0c35fe8
fix(poc-d3d): webcam hwaccel, decode cadence and clip auto-advance
EtienneLescot Jul 20, 2026
499ad15
fix(scene): tag regions with their clip, follow the chosen aspect, an…
EtienneLescot Jul 20, 2026
1f85715
fix(preview): timeline ordering, roundness, stray 'ended' events, sta…
EtienneLescot Jul 20, 2026
f228175
fix(compositor): resolve the PATH-dependent ffmpeg addon load and fin…
EtienneLescot Jul 20, 2026
7a36897
fix(compositor): corner rounding, background cover, crop aspect and e…
EtienneLescot Jul 20, 2026
370c960
fix(export): prefetch the cursor track, and settle the Source and ups…
EtienneLescot Jul 21, 2026
9650b36
fix(compositor): webcam PiP dragging, and a drop shadow that went ell…
EtienneLescot Jul 21, 2026
3c73fbb
fix: video-effects slider desync, a slow background picker, and the H…
EtienneLescot Jul 21, 2026
fec349d
fix(document): scope speed regions per clip, keep other assets' trims…
EtienneLescot Jul 21, 2026
1f82119
perf(preview): multi-clip trim jumps, canvas buffers and a decoupled …
EtienneLescot Jul 21, 2026
5e9eb4d
perf(timeline): optimistic drag, memoised components and direct-DOM s…
EtienneLescot Jul 21, 2026
e019ded
fix(architecture): anchor modifiers to clip boundaries and reproject …
EtienneLescot Jul 22, 2026
41f42a5
fix(vite): dedupe react so the app runs from a git worktree
EtienneLescot Jul 23, 2026
2c93d76
fix(timeline): anchor modifiers to clips and merge regions by identity
EtienneLescot Jul 23, 2026
16a704f
fix(compositor): rasterise at the output geometry, and drop the stret…
EtienneLescot Jul 23, 2026
bef3ef5
perf(compositor): deliver only the preview frames that changed, and r…
EtienneLescot Jul 23, 2026
d2dc5a0
fix(preview): keep a mid-transition pause, and resolve regions from t…
EtienneLescot Jul 23, 2026
26caae3
fix(document): finish migrating v1.7 projects when the media duration…
EtienneLescot Jul 23, 2026
6d86041
feat(layout): weld screen and camera into one contain-fitted block, a…
EtienneLescot Jul 24, 2026
88936d8
fix: derive the dev ffmpeg dir from the cargo pin, and drop a region …
EtienneLescot Jul 24, 2026
deb5cc3
fix(layout): stop the block camera inheriting the picture-in-picture …
EtienneLescot Jul 24, 2026
09009f8
feat(topbar): swap the placeholder tile for the transparent brand mark
EtienneLescot Jul 24, 2026
3ca7f2a
fix(timeline): let Shift+wheel pan even when Ctrl is held
EtienneLescot Jul 24, 2026
867bc8d
docs(design): ship the brand mark and the token vocabulary the cards …
EtienneLescot Jul 24, 2026
f22e17a
fix(layout): fit the screen box to the crop, and resolve the layout p…
EtienneLescot Jul 24, 2026
910a8c9
docs(poc-d3d): flag the dead VITE_NATIVE_COMPOSITOR opt-in as removed
EtienneLescot Jul 24, 2026
b3e1ff0
feat(brand): ship Geist, the typeface the design system always specified
EtienneLescot Jul 24, 2026
9b94029
refactor(scene): carry fractions across the native contract, never pi…
EtienneLescot Jul 24, 2026
d3d4601
fix(dev): give each checkout its own vite dependency cache
EtienneLescot Jul 24, 2026
42f43a4
feat(timeline): resolve the output format and size from every clip's …
EtienneLescot Jul 24, 2026
48bedd1
fix(timeline): resize a clip when its source range is edited, and fix…
EtienneLescot Jul 25, 2026
8fad42c
feat(agent): give the agent delete tools and camera-fullscreen, with …
EtienneLescot Jul 25, 2026
5a58c62
fix(annotations): start text annotations empty, with a placeholder
EtienneLescot Jul 25, 2026
3eeb8a7
fix(recording): the WGC frame mutex, even dimensions, a writer hang n…
EtienneLescot Jul 16, 2026
fac4ef8
fix: the playhead jumping at a reordered junction, and the mic surviv…
EtienneLescot Jul 25, 2026
d12641c
feat(editor): a free speed field beyond 3x, and zoom focus that can f…
EtienneLescot Jul 25, 2026
4e7d504
docs(engineering): record what the remediation branch delivered
EtienneLescot Jul 25, 2026
a2df688
feat(zoom): a global auto-focus toggle, steady eases and honest previ…
EtienneLescot Jul 25, 2026
5cac7f6
feat(zoom): expose the 3D rotation presets
EtienneLescot Jul 25, 2026
d04a838
feat(annotations): render annotations in the native compositor — arro…
EtienneLescot Jul 25, 2026
39001fe
feat(annotations): create and edit annotations from the inspector
EtienneLescot Jul 25, 2026
6a4216c
fix(zoom): match the diagonal arrowheads, and make the 3D containment…
EtienneLescot Jul 25, 2026
09f5a9b
fix(annotations): one standard colour field, a reversible background …
EtienneLescot Jul 26, 2026
3bd1b2f
feat(editor): New-project starting points, i18n for the right rail, a…
EtienneLescot Jul 26, 2026
fe2d70f
docs(engineering): audit main against feat/ai-edition and spec the re…
EtienneLescot Jul 25, 2026
9f9506a
fix(zoom): the tilt was a collapsing quadratic — round its shadow and…
EtienneLescot Jul 26, 2026
9867d39
feat(captions): make captions an independent, transcript-derived layer
EtienneLescot Jul 26, 2026
bd547eb
fix(captions): group translated captions into phrases, over the share…
EtienneLescot Jul 26, 2026
4cde269
perf(hud): reserve the overlay's space instead of discovering it
EtienneLescot Jul 26, 2026
b43adda
Merge origin/main into feat/ai-edition
EtienneLescot Jul 26, 2026
af80916
feat: add Fedora RPM packaging support
Mundo-Dev0ps 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
  •  
  •  
  •  
31 changes: 31 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "vite-dev",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--", "--port", "5199", "--strictPort"],
"port": 5199,
"env": { "NO_ELECTRON": "1" }
},
{
"name": "desktop-dev",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev", "--", "--port", "5201", "--strictPort"],
"port": 5201,
"env": { "NO_ELECTRON": "1" }
},
{
"name": "v4preview",
"runtimeExecutable": "node",
"runtimeArgs": ["node_modules/vite/bin/vite.js", "--config", "vite.v4preview.config.ts"],
"port": 5207
},
{
"name": "poc",
"runtimeExecutable": "npx",
"runtimeArgs": ["vite", "--config", "poc/vite.config.js"],
"port": 5210
}
]
}
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"
12 changes: 12 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ jobs:
path: caption-assets
key: caption-assets-${{ runner.os }}-${{ hashFiles('scripts/fetch-caption-model.mjs') }}

# ponytail: STT is handled by the bundled whisper-stt-server (whisper.cpp
# with native DTW token timestamps). No separate VAD model is fetched
# here. See docs/engineering/stt-spec.md for the full architecture.

- name: Build Windows app
run: npm run build:win -- --publish never

Expand Down Expand Up @@ -71,6 +75,10 @@ jobs:
path: caption-assets
key: caption-assets-${{ runner.os }}-${{ hashFiles('scripts/fetch-caption-model.mjs') }}

# ponytail: STT is handled by the bundled whisper-stt-server (whisper.cpp
# with native DTW token timestamps). No separate VAD model is fetched
# here. See docs/engineering/stt-spec.md for the full architecture.

- name: Build Windows Store package
run: npm run build:win:store -- --publish never

Expand Down Expand Up @@ -112,6 +120,8 @@ jobs:
path: caption-assets
key: caption-assets-${{ runner.os }}-${{ hashFiles('scripts/fetch-caption-model.mjs') }}

# ponytail: STT is handled by the bundled whisper-stt-server (see the
# build-windows comment); no VAD model is fetched here.
- name: Resolve macOS signing
id: signing
env:
Expand Down Expand Up @@ -275,6 +285,7 @@ jobs:
path: caption-assets
key: caption-assets-${{ runner.os }}-${{ hashFiles('scripts/fetch-caption-model.mjs') }}

# ponytail: no VAD fetch here either (see build-windows comment).
- name: Build Linux app
run: npm run build:linux -- --publish never

Expand All @@ -287,6 +298,7 @@ jobs:
release/**/*.zsync
release/**/*.deb
release/**/*.pacman
release/**/*.rpm
if-no-files-found: error
retention-days: 30

Expand Down
65 changes: 65 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Docs

on:
pull_request:
branches: [main]
paths:
- "website/**"
- ".github/workflows/docs.yml"
push:
branches: [main]
paths:
- "website/**"
- ".github/workflows/docs.yml"
workflow_dispatch:

# Cancel in-flight runs on the same ref so fast follow-up pushes
# don't queue stale builds.
concurrency:
group: docs-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
build:
name: Build site
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
persist-credentials: false
- uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
with:
node-version: 22
cache: npm
cache-dependency-path: website/package-lock.json
- name: Install dependencies
working-directory: website
run: npm ci
- name: Type-check
working-directory: website
run: npm run typecheck
- name: Build
working-directory: website
run: npm run build
- name: Upload artifact
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1
with:
path: website/build

deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
needs: build
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
permissions:
pages: write
id-token: write
steps:
- id: deployment
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
Loading
Loading