Releases: SysAdminDoc/OpenCut
OpenCut v1.9.23 — UXP a11y polish
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 orphanaria-labelledby=""and the other 6 panels had no attribute at all, leaving screen readers unable to announce the active section. AssignedtabBtn{Cut,Captions,Audio,Video,Timeline,Search,Deliverables,Settings}ids to each tab button and wired each panel'saria-labelledbyto the matching id. - All 72 UXP
<button>elements now carry explicittype="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. .hiddenand.oc-hiddenunified asdisplay: none !important— previously only scoped to.oc-result-area.hiddenand.oc-processing-banner.hidden, so toggling.hiddenon 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)
/filepreview route allowlist restored (realpath must be under tempdir or~/.opencut, MIME type must be audio/video/image) — reverts a v1.9.21 security regressionsafe_bool()hardened against NaN/inf/containers — reject lists/tuples/sets/dicts that were previously coerced to True- 15 more
safe_boolcall sites across audio/captions/system/video_ai/video_core/video_editing routes mcp_server.pyJSON-RPC serialization fallback (default=str+-32603on failure) so non-serializable tool results can no longer hang the clientcore/highlights.pynull-safe guard onresponse.text.startswith(...)when LLM provider returns an empty responseroutes/system.pymovedtempfile+OPENCUT_DIRto function-local imports insideserve_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
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.py—include_context_fillers,remove_silence,
auto_importon/audio/separatecaptions.py—word_timestamps,auto_detect_energy,
skip_captions,skip_zoom,remove_fillers,diarizesystem.py—cpu_modeon/whisper/reinstallvideo_ai.py—alpha_onlyon/video/ai/backgroundvideo_core.py—transparent,preview,auto_importon
/video/watermark,audio_onlyon/video/export,use_faces
on/export/thumbnails,parallelon/batch/createvideo_editing.py—use_visionon/video/highlights
safe_bool() itself is also hardened:
NaN/inf/-inffloats return the caller default instead of
True(consistent withsafe_floatbehaviour).bytes/bytearrayvalues are decoded as UTF-8 and parsed like
strings, sob"false"correctly returnsFalse.- Lists, tuples, sets, dicts, and arbitrary objects return the
caller default. Previously non-empty containers silently coerced
toTrue.
Covered by a 25-case parametrized unit test in
tests/test_boolean_coercion.py.
Backend — defensive fixes
core/highlights.py—extract_highlights()now toleratesNone
/ 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-32603error instead of leaving the client hanging.
Frontend — CEP panel reliability
Two real regressions uncovered by the panel state audit:
mediaScanTimerreconnect 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._statusTimerreconnect 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-historyutility classes replacing
inlinestyle="display:none"attributes. - Cut tab accessibility fix:
aria-labelledbynow 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.py—TestPreviewFileServingadds 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.py→ 377 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
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/settings—cpu_modePOST /context/analyze—has_audio,has_videoPOST /audio/enhance—denoise,enhancePOST /video/auto-zoom—apply_to_filePOST /video/shorts-pipeline—face_track,burn_captions
Backend — /file preview route
/filenow 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
themake_install_route()factory.
Tests
- New
tests/test_boolean_coercion.pycovering/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/analyzeno
longer flip tags toTrue.tests/test_new_features.py—/fileroute 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
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 leak —
core/llm.pypassed?key={api_key}in the query string, which leaked through_http_json()HTTPError messages. Key now sent viax-goog-api-keyheader; 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.pywere 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. Fixedrender_title_card,overlay_title, and the typewriter word-reveal loop.
Queue System Broken for 19 Routes
_ALLOWED_QUEUE_ENDPOINTSout of sync — 19@async_job-decorated routes silently failed/queue/addwith "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 race —
es.onmessageandtrackJobPollcallbacks could callonJobDone()for a job thatcancelJob()had already cleared. Addedif (!currentJob)guard so stale events after cancel are dropped.
Resource Leaks
- audio_enhance GPU cleanup no-op —
audio.cpu()/mono.cpu()were called without assignment beforedel, which creates a discarded CPU copy instead of releasing the GPU tensor. Thedelalone releases the reference; the.cpu()was wasted work. Removed. - animated_captions temp file leak — if
cv2.VideoWriter.isOpened()returned False, thetempfile.NamedTemporaryFilewas 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 socleanupTimers()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
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
Performance Audit & Memory Leak Fixes
Critical Fixes
/video/auto-zoombroken return — route returned{}instead ofresult_dict, discarding keyframes and output path entirely- Unbounded thread spawning —
_persist_job()and_schedule_record_time()spawned rawthreading.Threadper call; replaced with boundedThreadPoolExecutor(2)to prevent 200+ thread leak under batch load - Rate limit slot leak —
make_install_route()permanently lost rate_limit slot whenrate_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.pynever closed on shutdown; added connection tracking andclose_all_connections()
Thread Safety & Stability
- Timer thread spam — temp file cleanup spawned new
threading.Timerper retry (300+ threads on Windows batch cleanup); replaced with single background worker thread - Haar cascade race condition —
auto_zoom._get_cascade()wrote global singleton from multiple threads without locking; added double-checked locking - CEP health timer leak —
setIntervalreassigned withoutclearIntervalon 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.suppressreplacing baretry/except: passpatterns- Import ordering cleanup (
make_install_routehoisted 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
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 withencoding="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) —
denoiseandscene-detectadded, 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
What's New in v1.9.3
Refactored
- Split
video.pyinto 5 domain blueprints — Monolithic 3636-linevideo.pysplit intovideo_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_jobdecorator adoption — All 97 manual_new_job()+threading.Thread+_update_job(status="complete")patterns across 6 route files converted to the@async_jobdecorator. Fixes a race condition where cancelled jobs could be overwritten to "complete". Removes ~2,800 lines of boilerplate. Decorator extended withfilepath_requiredandfilepath_paramparameters.- App factory pattern —
server.pynow exposescreate_app(config)for isolated Flask instances. Newopencut/config.pycentralizes env var reads intoOpenCutConfigdataclass. Tests use independent app instances. - Install route factory —
make_install_route()inopencut/jobs.pyreplaces 6 identical install endpoint handlers (depth, emotion, multimodal-diarize, broll-generate, face, crisper-whisper) with a single factory call per route. - Version sync CI enforcement —
scripts/sync_version.pynow includespackage.jsonin targets and supports--checkflag. 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__()withimportlib, 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 + extensionsOpenCut-Server-v1.9.3-win64.zip— Standalone server distribution (227 MB)
OpenCut v1.9.2
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 Enforcement —
pytest-covwith 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__()withimportlib.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
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) orresnet50(higher quality) - Selectable alongside existing rembg backend in the Video AI panel
Florence-2 Auto Watermark Detection
- New
/video/auto-detect-watermarkendpoint - 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.pycore 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-otioendpoint 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
/healthresponse (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