Skip to content

Releases: SysAdminDoc/OpenCut

OpenCut v1.9.23 — UXP a11y polish

11 Apr 22:30

Choose a tag to compare

v1.9.23 — UXP Accessibility Polish (Round-2 audit follow-up)

Incremental release on top of v1.9.22 that lands the remaining UXP accessibility fixes surfaced during the second QA audit round.

What's in v1.9.23

  • 7 UXP tab panels now have working aria-labelledby — previously the Cut panel had an orphan aria-labelledby="" and the other 6 panels had no attribute at all, leaving screen readers unable to announce the active section. Assigned tabBtn{Cut,Captions,Audio,Video,Timeline,Search,Deliverables,Settings} ids to each tab button and wired each panel's aria-labelledby to the matching id.
  • All 72 UXP <button> elements now carry explicit type="button" — previously 61/72 were missing it. No active <form> in the UXP doc (so no implicit submit), but CLAUDE.md mandates explicit type on all buttons. Closes the gap with the CEP panel's 179/179 coverage.
  • .hidden and .oc-hidden unified as display: none !important — previously only scoped to .oc-result-area.hidden and .oc-processing-banner.hidden, so toggling .hidden on any other element (e.g., depth install hint, NLP result card) was a silent no-op. New global rule makes the utility class work regardless of element type.

Everything v1.9.22 shipped (recap)

  • /file preview route allowlist restored (realpath must be under tempdir or ~/.opencut, MIME type must be audio/video/image) — reverts a v1.9.21 security regression
  • safe_bool() hardened against NaN/inf/containers — reject lists/tuples/sets/dicts that were previously coerced to True
  • 15 more safe_bool call sites across audio/captions/system/video_ai/video_core/video_editing routes
  • mcp_server.py JSON-RPC serialization fallback (default=str + -32603 on failure) so non-serializable tool results can no longer hang the client
  • core/highlights.py null-safe guard on response.text.startswith(...) when LLM provider returns an empty response
  • routes/system.py moved tempfile + OPENCUT_DIR to function-local imports inside serve_file() (fixes the v1.9.21 CI lint failure)

Downloads

  • Windows: OpenCut-Server-Windows.tar.gz (PyInstaller onedir, WebView2-ready)
  • Linux: OpenCut-Server-Linux.tar.gz
  • macOS: OpenCut-Server-macOS.tar.gz

Binaries are built by GitHub Actions CI and uploaded automatically. If the download links below show "(no assets yet)", the CI run is still in progress — refresh in a few minutes.

v1.9.22 — Audit round: /file regression revert, timer leaks, boolean coercion sweep

11 Apr 22:28

Choose a tag to compare

OpenCut v1.9.22 — Audit Round

Full QA pass over v1.9.21 by parallel audit agents (backend security,
frontend state, route boolean coercion). This release reverts one
security regression, finishes a half-complete boolean-coercion
sweep, and fixes two CEP panel reliability regressions uncovered by
the audit.

Security — /file preview route regression (reverted)

v1.9.21 replaced the realpath allowlist on GET /file with a
MIME-type check, reasoning that the allowlist blocked legitimate
Premiere project media previews. That reasoning was wrong — the
CEP panel only ever passes backend-generated output paths (TTS,
SFX, music) to /file, all of which live under
~/.opencut or the system temp dir. With the allowlist removed, any
page loaded in the user's browser could side-channel-enumerate local
media files via <img>/<audio> tags pointing at
http://127.0.0.1:5679/file?path=….

Fixed. The realpath allowlist is restored and the MIME-type
check is kept as defence-in-depth. /file now refuses anything
outside tempdir + ~/.opencut, and anything that isn't
audio/video/image MIME, even inside those roots.

Backend — safe_bool() hardening + completion sweep

v1.9.21's safe_bool() helper was threaded into ~6 routes but the
underlying bug class (bool("false") is True) still existed in 15
more places. All finished in this release:

  • audio.pyinclude_context_fillers, remove_silence,
    auto_import on /audio/separate
  • captions.pyword_timestamps, auto_detect_energy,
    skip_captions, skip_zoom, remove_fillers, diarize
  • system.pycpu_mode on /whisper/reinstall
  • video_ai.pyalpha_only on /video/ai/background
  • video_core.pytransparent, preview, auto_import on
    /video/watermark, audio_only on /video/export, use_faces
    on /export/thumbnails, parallel on /batch/create
  • video_editing.pyuse_vision on /video/highlights

safe_bool() itself is also hardened:

  • NaN / inf / -inf floats return the caller default instead of
    True (consistent with safe_float behaviour).
  • bytes / bytearray values are decoded as UTF-8 and parsed like
    strings, so b"false" correctly returns False.
  • Lists, tuples, sets, dicts, and arbitrary objects return the
    caller default. Previously non-empty containers silently coerced
    to True.

Covered by a 25-case parametrized unit test in
tests/test_boolean_coercion.py.

Backend — defensive fixes

  • core/highlights.pyextract_highlights() now tolerates None
    / missing-attribute LLM responses instead of raising when the
    provider is unreachable mid-request.
  • mcp_server.py — JSON-RPC response serialisation is wrapped in
    try/except; non-JSON-serialisable tool results now return a
    proper -32603 error instead of leaving the client hanging.

Frontend — CEP panel reliability

Two real regressions uncovered by the panel state audit:

  • mediaScanTimer reconnect leak. cleanupTimers() kills the
    project media poller on every disconnect, but only the initial
    bootstrap restarted it. After one server disconnect/reconnect the
    panel silently stopped detecting new media imported into
    Premiere until the user reloaded the panel.
  • _statusTimer reconnect leak. Same bug for the system status
    bar — after one reconnect it would show stale GPU/job counts
    until reload.

Both are fixed by a new startBackgroundPollers() helper called
from both the init path and the health-check reconnect branch.
initStatusBar() is now idempotent (guards against double timers
on re-entry), and a spurious var _statusTimer redeclaration that
was shadowing the module-scope hoisted variable has been removed.

UXP panel polish

  • New .oc-hidden / .oc-chat-history utility classes replacing
    inline style="display:none" attributes.
  • Cut tab accessibility fix: aria-labelledby now references a
    real button id.

Tests

  • test_boolean_coercion.py — 25 parametrized cases for
    safe_bool (bools, ints, floats, NaN/inf, strings, bytes,
    containers, arbitrary objects).
  • test_new_features.pyTestPreviewFileServing adds a third
    case: a media file OUTSIDE the approved roots must return 403
    regardless of MIME type.
  • Focused validation: pytest -q tests/test_boolean_coercion.py tests/test_context.py tests/test_new_features.py tests/test_integration.py tests/test_core_modules.py tests/test_core_modules_batch2.py377 passed, 3 skipped.

Artifact

Windows x64 PyInstaller build attached as
OpenCut-Server-v1.9.22-win-x64.zip (~226 MB). Unzip and run
OpenCut-Server\OpenCut-Server.exe or the standard
OpenCut-Server.bat / OpenCut-Launcher.vbs launchers.

v1.9.21 — CEP panel UX polish + boolean coercion hardening

11 Apr 22:10

Choose a tag to compare

OpenCut v1.9.21

Polish round focused on the CEP panel experience, Premiere project
media detection, and hardening the backend against sloppy boolean
payloads coming from the panel.

Extension — premium UX / visual pass

  • Studio Shell pass on the CEP panel chrome: tightened spacing rhythm,
    consistent button and icon set across all tabs, refreshed quick
    action bars.
  • Legacy theme switching and the sun/theme toggle button removed — the
    panel now ships a single polished Studio Graphite dark theme.
  • Transcript editor and timeline interactions tightened: selection,
    hover, active-cue tracking, and reconnect behavior no longer leave
    the panel in a stale state after a backend drop.
  • Unified button gating: project-level actions (deliverables, marker
    export, batch rename, SRT import, smart bins, footage search index)
    are no longer incorrectly disabled by the selected-clip state and
    now restore correctly after failures.

Premiere project media detection

  • New/reopened Premiere projects now correctly refresh the project
    media panel instead of serving a stale cache from the previous
    project.
  • Separate cache timestamps per Premiere project so switching between
    projects never mixes clip lists.
  • Hardened sequence info + sequence marker parsing so partially
    populated timelines still return usable responses instead of
    surfacing ExtendScript errors.

Reliability fixes (frontend)

  • Stale-async protection on preview, waveform, and frame thumbnail
    jobs — results from a previous file can no longer land on a newly
    selected clip.
  • Button state correctly restores after failed or cancelled jobs.
  • Toast reflow and reconnect handling hardened so quick network blips
    no longer leave the panel disabled.
  • Installer flow for optional dependencies fixed so users can retry
    failed installs from the panel instead of being wedged in the
    "installing…" state.

Backend — boolean coercion hardening

Route handlers that previously did bool(data.get(...)) treated the
string "false" as truthy, silently flipping user flags. Fixed with
a new safe_bool() helper that handles native booleans, numeric 0/1,
and common string forms (true/false, yes/no, on/off):

  • POST /whisper/settingscpu_mode
  • POST /context/analyzehas_audio, has_video
  • POST /audio/enhancedenoise, enhance
  • POST /video/auto-zoomapply_to_file
  • POST /video/shorts-pipelineface_track, burn_captions

Backend — /file preview route

  • /file now validates by media MIME type (audio/*, video/*,
    image/*) instead of a hardcoded temp/output prefix allowlist. This
    unblocks previewing validated local media referenced by newly
    opened Premiere projects while keeping the endpoint from being used
    as a generic local-file reader.

Backend — new install route

  • POST /timeline/otio/install — OpenTimelineIO installer exposed via
    the make_install_route() factory.

Tests

  • New tests/test_boolean_coercion.py covering /whisper/settings,
    /audio/enhance, /video/auto-zoom, and /video/shorts-pipeline
    end-to-end with string-"false" payloads.
  • tests/test_context.py — string booleans on /context/analyze no
    longer flip tags to True.
  • tests/test_new_features.py/file route serves validated local
    media and rejects non-media MIME types; OTIO and
    multimodal-diarize install routes exist.

Artifact

Windows x64 PyInstaller build attached as
OpenCut-Server-v1.9.21-win-x64.zip (~226 MB).
Unzip and run OpenCut-Server\OpenCut-Server.exe or use the standard
OpenCut-Server.bat / OpenCut-Launcher.vbs launchers.

OpenCut v1.9.20 — Audit Round: Security, FFmpeg Injection, Queue Allowlist

11 Apr 10:29

Choose a tag to compare

v1.9.20 — Security & Correctness Audit Round

This release focuses on verified bug fixes found during a comprehensive QA audit. Every fix below is a real, reproducible defect — not a style change.

Security

  • Gemini API key URL leakcore/llm.py passed ?key={api_key} in the query string, which leaked through _http_json() HTTPError messages. Key now sent via x-goog-api-key header; new _sanitize_url() helper strips query strings from every provider's error messages.

FFmpeg Filter Injection

  • drawtext double-escape — 3 filter builders in core/motion_graphics.py were escaping : and ; inside single-quoted drawtext values, producing literal \: / \; in rendered video (user text like "Chapter 1:" became "Chapter 1\:"). Inside single quotes only \ and ' need escaping. Fixed render_title_card, overlay_title, and the typewriter word-reveal loop.

Queue System Broken for 19 Routes

  • _ALLOWED_QUEUE_ENDPOINTS out of sync — 19 @async_job-decorated routes silently failed /queue/add with "Endpoint not queueable": /audio/beats, /audio/duck-video, /audio/effects/apply, /audio/gen/{tone,sfx}, /audio/isolate, /audio/mix, /audio/mix-duck, /audio/music-ai/{generate,melody}, /audio/pro/deepfilter, /audio/waveform, /export/{preset,thumbnails}, /social/upload, /video/broll-generate, /video/multimodal-diarize, /video/transitions/{apply,join}. All 19 added (101 endpoints total).

Race Conditions

  • CEP SSE/poll stale-event racees.onmessage and trackJobPoll callbacks could call onJobDone() for a job that cancelJob() had already cleared. Added if (!currentJob) guard so stale events after cancel are dropped.

Resource Leaks

  • audio_enhance GPU cleanup no-opaudio.cpu() / mono.cpu() were called without assignment before del, which creates a discarded CPU copy instead of releasing the GPU tensor. The del alone releases the reference; the .cpu() was wasted work. Removed.
  • animated_captions temp file leak — if cv2.VideoWriter.isOpened() returned False, the tempfile.NamedTemporaryFile was never unlinked on the error path. Added cleanup.

Defensive

  • main.js timer hoist — hoisted 6 timer variable declarations (_statusTimer, _scanDebounceTimer, _projectMediaRetryTimer, editDebounceTimer, _alertTimer, _wsReconnectTimer) to the outer IIFE scope so cleanupTimers() has a stable reference chain.

Audit scope: ~60K LoC Python + 10K LoC CEP main.js + 2.7K UXP + 2.3K JSX. ~90 findings reviewed, 7 real fixes applied, 83 false positives filtered.

Verification: ruff clean, 124 unit tests pass, version sync passes.

Downloads

  • Windows: OpenCut-Server-Windows.tar.gz (PyInstaller onedir, WebView2-ready)
  • Linux: OpenCut-Server-Linux.tar.gz
  • macOS: OpenCut-Server-macOS.tar.gz

Binaries are built by GitHub Actions CI (.github/workflows/build.yml) and uploaded automatically. If the download links below show "(no assets yet)", the CI run is still in progress — refresh in a few minutes.

OpenCut v1.9.19

08 Apr 20:13

Choose a tag to compare

What's New in v1.9.19

CEP Panel UI Overhaul

  • Redesigned alert banners with eyebrow labels and inline SVG icons
  • Quick action buttons with icon + meta description layout
  • Transcript timeline ruler for visual segment navigation
  • Emotion highlights and depth map feature cards
  • Studio Shell CSS pass — responsive breakpoints, 4px spacing rhythm, complete interactive states

Comprehensive Audit & Modernization

  • Phase 1–3 dependency modernization complete (ONNX style transfer, Skia caption renderer, RIFE interpolation, Stable Audio, Wan 2.1, SeamlessM4T auto-detect)
  • Stale model references updated (SAM 2.1, pyannote token kwarg)
  • Full audit across all modules

Build

  • Windows x64 standalone executable (PyInstaller)
  • Extract ZIP and run OpenCut-Server.exe
  • Requires FFmpeg on PATH (or use the full installer for bundled FFmpeg)

OpenCut v1.9.16

04 Apr 20:42

Choose a tag to compare

Performance Audit & Memory Leak Fixes

Critical Fixes

  • /video/auto-zoom broken return — route returned {} instead of result_dict, discarding keyframes and output path entirely
  • Unbounded thread spawning_persist_job() and _schedule_record_time() spawned raw threading.Thread per call; replaced with bounded ThreadPoolExecutor(2) to prevent 200+ thread leak under batch load
  • Rate limit slot leakmake_install_route() permanently lost rate_limit slot when rate_limit() returned False, eventually blocking all model installs until server restart

Memory & GPU Fixes

  • GPU memory leak in audio_enhance — CUDA tensors not fully released between calls; now moves tensors to CPU, deletes all refs, then clears cache
  • Color match frame buffer waste — BGR frames kept alongside YCbCr copies (~124MB at 1080p); freed immediately after conversion
  • SQLite connection leak — thread-local connections in job_store.py never closed on shutdown; added connection tracking and close_all_connections()

Thread Safety & Stability

  • Timer thread spam — temp file cleanup spawned new threading.Timer per retry (300+ threads on Windows batch cleanup); replaced with single background worker thread
  • Haar cascade race conditionauto_zoom._get_cascade() wrote global singleton from multiple threads without locking; added double-checked locking
  • CEP health timer leaksetInterval reassigned without clearInterval on failure, accumulating parallel health check intervals

Code Quality (Prior Session Merge)

  • subprocess.run(check=False) added across all bare subprocess calls
  • Exception chaining (raise ... from err) for proper tracebacks
  • contextlib.suppress replacing bare try/except: pass patterns
  • Import ordering cleanup (make_install_route hoisted to top-level imports)
  • FFmpeg dependency check robustness (returncode + version validation)
  • audio_suite.measure_loudness() now raises on ffmpeg failure
  • Clip-notes example plugin upgraded to SQLite storage with legacy JSON compat
  • CEP panel: workspace state persistence, theme/style overhaul
  • New tests for loudness failure and ffmpeg dependency edge cases

OpenCut v1.9.15

27 Mar 23:41

Choose a tag to compare

OpenCut v1.9.15

Highlights (v1.9.4 → v1.9.15)

Security & Stability

  • 80+ bugs fixed across 12 patch releases
  • 4 security vulnerabilities patched (path traversal, symlink escape, model injection)
  • 23 crash bugs fixed (callback TypeError, CLI import errors, encoding failures)
  • 58 bare ffmpeg/ffprobe subprocess calls resolved for bundled install compatibility
  • 14 text file open() calls fixed with encoding="utf-8" for Windows compatibility

New Features

  • Priority WorkerPool — critical jobs leapfrog background work when workers busy
  • 23 MCP tools (up from 18) — denoise, upscale, scene detect, depth map, shorts pipeline
  • 22 response schemas (up from 13) with OpenAPI coverage for 15+ more endpoints
  • 4 new UXP video features — Upscale, Scene Detection, Style Transfer, Shorts Pipeline
  • 16 CLI commands (up from 14) — denoise and scene-detect added, 4 broken commands fixed
  • Docker GPU profile via docker compose --profile gpu up

Quality

  • Comprehensive audit across all routes, core modules, frontend, and infrastructure
  • 0 lint warnings, all 18 version targets synced
  • 254 routes, 23 MCP tools, 23 schemas, 16 CLI commands verified
  • All tests passing

Install

Download OpenCut-Server-Windows.tar.gz, extract, and run OpenCut-Server.exe.
Or install via pip: pip install -e . then opencut-server.

OpenCut v1.9.3

27 Mar 05:24

Choose a tag to compare

What's New in v1.9.3

Refactored

  • Split video.py into 5 domain blueprints — Monolithic 3636-line video.py split into video_core.py (1395), video_editing.py (750), video_fx.py (687), video_specialty.py (489), video_ai.py (443). No file exceeds 1400 lines. All URL paths unchanged — zero breaking changes.
  • @async_job decorator adoption — All 97 manual _new_job() + threading.Thread + _update_job(status="complete") patterns across 6 route files converted to the @async_job decorator. Fixes a race condition where cancelled jobs could be overwritten to "complete". Removes ~2,800 lines of boilerplate. Decorator extended with filepath_required and filepath_param parameters.
  • App factory patternserver.py now exposes create_app(config) for isolated Flask instances. New opencut/config.py centralizes env var reads into OpenCutConfig dataclass. Tests use independent app instances.
  • Install route factorymake_install_route() in opencut/jobs.py replaces 6 identical install endpoint handlers (depth, emotion, multimodal-diarize, broll-generate, face, crisper-whisper) with a single factory call per route.
  • Version sync CI enforcementscripts/sync_version.py now includes package.json in targets and supports --check flag. Added to CI pipeline.

Also included (from v1.9.2 changelog)

  • JSON structured logging, CI coverage enforcement (50% threshold)
  • Structured error migration — zero bare 500 errors remain
  • Smart tab reordering by contextual relevance
  • 150+ new core module unit tests, ExtendScript mock harness
  • Pre-commit hooks (ruff lint/format + pytest smoke)
  • Security: replaced __import__() with importlib, GPUContext memory leak fix, XSS/injection fixes, timer leak fixes
  • Codebase at 0 lint warnings

Downloads

  • OpenCut-Setup-1.9.3.exe — Full self-extracting installer (355 MB) with server + FFmpeg + extensions
  • OpenCut-Server-v1.9.3-win64.zip — Standalone server distribution (227 MB)

OpenCut v1.9.2

27 Mar 01:36

Choose a tag to compare

What's New in v1.9.2

v1.9.0 — Core Features

  • Contextual Awareness — 35-feature relevance scoring based on clip metadata. Guidance banners and sub-tab highlights based on what you're editing
  • Plugin System — Discover, load, and manage plugins from ~/.opencut/plugins/. Ships with timecode-watermark and clip-notes example plugins
  • Multicam XML Export — Generate Premiere Pro-compatible FCP XML from multicam diarization cuts
  • SQLite FTS5 Footage Index — Persistent full-text search index replaces JSON index. Incremental re-indexing via mtime
  • NDJSON Response Streaming — Progressive delivery of large result sets (segments, scenes, thumbnails)
  • 13 Blueprints, 175+ endpoints — Context and Plugins blueprints added

v1.9.1 — Batch & Testing

  • Parallel Batch Processing — ThreadPoolExecutor with GPU/CPU worker isolation, partial failure handling
  • Clip Notes Plugin — SQLite-backed per-clip notes with text/CSV export
  • 175+ Endpoint Smoke Tests — Full route coverage across all 13 blueprints

v1.9.2 — Quality & Security

  • JSON Structured Logging — File handler outputs JSON with timestamp, level, module, job_id
  • CI Coverage Enforcementpytest-cov with 50% threshold, PR/push triggers
  • Structured Error Migration — Zero bare {"error": str(e)} patterns remain. All API errors return {error, code, suggestion}
  • Smart Tab Reordering — Sub-tabs reorder by contextual relevance scores
  • 150+ New Core Module Tests — 28 previously untested modules now covered
  • ExtendScript Mock Harness — 38 JSX functions tested under Node.js (35 assertions)
  • Pre-commit Hooks — ruff lint/format + pytest smoke on pre-push

Security

  • Replaced all __import__() with importlib.import_module()
  • 96 routes hardened: TooManyJobsError → proper 429 responses
  • AI GPU rate limiting prevents concurrent OOM crashes
  • XSS fix in engine registry, ASS subtitle injection prevention
  • Reframe dimension DoS protection (16-7680px bounds)

Bug Fixes

  • GPUContext memory leak — __exit__ now calls .cpu() on models
  • batch_id collision risk reduced (8→16 hex chars)
  • 5 timer/interval leaks fixed (elapsed, mediaScan, poll, SSE parse)
  • 23 import sorting + 15 unused import + 4 unused variable fixes
  • Codebase at 0 lint warnings

Downloads

  • OpenCut-Server-v1.9.2-win64.zip — Standalone server (extract & run)
  • OpenCut-Setup.exe — WPF installer with optional dependency management

OpenCut v1.9.0

26 Mar 05:11

Choose a tag to compare

OpenCut v1.9.0 — AI Detection Upgrades, OTIO Export, Emotion Highlights

New Features

Silero VAD — Neural Silence Detection

  • AI-powered voice activity detection as an alternative to energy threshold
  • Three modes: energy (classic FFmpeg), vad (Silero neural), auto (tries VAD first, falls back to energy)
  • Far more accurate in noisy environments — uses a 1.8MB ONNX model, <1ms per 30ms chunk
  • Dropdown selector in the Silence Removal panel

CrisperWhisper — Verbatim Filler Detection

  • New filler detection backend using the nyrahealth/CrisperWhisper model
  • Transcribes speech verbatim, explicitly marking fillers as [UH] and [UM] with precise timestamps
  • Standard Whisper actively omits fillers — CrisperWhisper captures them all
  • Selectable via dropdown in the Filler Word Detection panel

Robust Video Matting (RVM)

  • New background removal backend with temporal consistency across frames
  • Uses a recurrent neural network that exploits temporal information — no flickering between frames
  • Two models: mobilenetv3 (fast) or resnet50 (higher quality)
  • Selectable alongside existing rembg backend in the Video AI panel

Florence-2 Auto Watermark Detection

  • New /video/auto-detect-watermark endpoint
  • Uses Florence-2 vision-language model to automatically locate watermark regions
  • Detects logos, text overlays, and watermarks with a natural language prompt
  • Edge-density fallback when Florence-2 is not installed

Emotion-Based Highlights

  • New emotion_highlights.py core module using deepface facial expression analysis
  • Builds an emotion curve over time, identifying peaks of emotional significance
  • New "Emotion Highlights (Face AI)" button in the Captions tab
  • Complements LLM-based highlight extraction with visual emotion signals

Engagement Scoring

  • Multi-signal highlight quality scoring: hook strength, emotional peak, pacing, quotability
  • Blended with LLM scores (60% LLM, 40% engagement) for better highlight ranking
  • Engagement breakdown returned in shorts pipeline and highlight extraction responses

OpenTimelineIO Export

  • New /timeline/export-otio endpoint with three modes: cuts, segments, markers
  • Universal timeline interchange format supported by DaVinci Resolve, Avid, FCP, and more
  • Export silence/filler cuts as an OTIO file importable into any compatible NLE

Improved Thumbnail Scoring

  • Composition balance analysis via edge density in quadrants
  • Center interest bonus for well-framed subjects
  • Motion blur penalty using gradient variance detection

Frontend & UXP Improvements

  • Detection method dropdown for silence removal (energy / VAD / auto)
  • Filler backend selector (Whisper / CrisperWhisper)
  • Background removal backend selector (rembg / RVM) with model list update
  • Project media scan debouncing prevents redundant API calls
  • Capability cache resets on disconnect so buttons re-evaluate on reconnect
  • Non-2xx HTTP responses properly surfaced as errors in API layer
  • UXP panel: AbortSignal.timeout() polyfill for older UXP runtimes
  • UXP panel: PProBridge.getProjectItems() for project media browsing
  • ExtendScript: import verification polling (replaces single-check), indentation cleanup

Backend

  • 7 new dependency checks: silero_vad, crisper_whisper, sam2, propainter, otio, deepface, rvm
  • Capabilities reported in /health response (silero_vad, crisper_whisper, otio)
  • New docs: RESEARCH.md, ROADMAP.md (moved to docs/), UXP_MIGRATION.md

Install

Download OpenCut-Setup-1.9.0.exe below — handles everything (server, FFmpeg, CEP extension, registry keys, desktop shortcut). No Python or FFmpeg required.

Or from source:

git clone https://github.com/SysAdminDoc/OpenCut.git
cd OpenCut
pip install -e ".[all]"
python -m opencut.server