ScriptCut is a maintained fork of CutScript focused on Apple Silicon reliability, 9Router support, and local-first creator workflows.
Edit videos by editing the transcript:
- delete words -> cut video
- remove filler words -> clean edit
- generate captions -> export clip
Built with Electron, React, FastAPI, WhisperX, FFmpeg, and local/cloud LLM integrations.
ScriptCut began as a fork/continuation of DataAnts-AI/CutScript.
This version focuses on:
- Apple Silicon macOS setup
- Python 3.10-3.12 compatibility
- 9Router support
- improved backend startup
- creator-oriented local-first workflows
- Electron + React desktop app with Tailwind CSS
- FastAPI Python backend
- WhisperX / Whisper transcription pipeline
- FFmpeg for video and audio processing
- Ollama / OpenAI / Claude / 9router for AI features
This version has been verified on Apple Silicon macOS for:
- backend startup via
npm run dev:backend - frontend production build
- health checks on
http://127.0.0.1:8642/health - transcription requests on both CPU and MPS paths
Important runtime notes:
- Use Python
3.10to3.12 - Python
3.11is the recommended Apple Silicon setup - Python
3.13is not a supported runtime for the current transcription dependency stack - The backend launcher now auto-selects a compatible local virtualenv or interpreter
- Node.js 18+
- Python 3.10 to 3.12
- FFmpeg in
PATH - Optional: Ollama for local AI features
brew install ffmpeg
python3.11 -m venv .venv
source .venv/bin/activateIf you want to force a specific interpreter, set:
export SCRIPTCUT_PYTHON_PATH=/absolute/path/to/pythonCUTSCRIPT_PYTHON_PATH is still supported for legacy setups, but SCRIPTCUT_PYTHON_PATH is preferred.
npm run setup
npm run doctornpm run devThat starts backend, frontend, and Electron together.
If you want to verify the backend separately:
npm run dev:backend
curl -s http://127.0.0.1:8642/healthExpected response:
{"status":"ok"}scriptcut/
├── electron/
├── frontend/
├── backend/
└── shared/
| Feature | Status |
|---|---|
| Word-level transcription | Done |
| Text-based video editing | Done |
| Undo/redo | Done |
| Waveform timeline | Done |
| Edited playback preview | Done |
| Project autosave and startup recovery | Done |
| Non-destructive edit layers | Done |
| FFmpeg stream-copy export | Done |
| FFmpeg re-encode export | Done |
| Job progress, cancellation, logs, retry | Done |
| AI filler review queue | Done |
| Editable AI clip drafts | Done |
| Ollama + OpenAI + Claude + 9router | Done |
| Word-level captions | Done |
| Caption designer and burn-in export | Done |
| Social presets and reframe controls | Done |
| Studio Sound | Done |
| Speaker diarization | Done |
| Speaker-aware transcript editing | Done |
Project save/load (.scriptcut, legacy .aive/.cutscript) |
Done |
| AI background removal | Done |
Project files are canonical JSON with schema: "scriptcut.project.v1" and version: 1. Manual saves and autosaves use the same serializer so recovery files are deterministic and migration-ready.
| Key | Action |
|---|---|
| Space | Play / Pause |
| J / K / L | Reverse / Pause / Forward |
| ← / → | Seek ±5 seconds |
| Delete | Delete selected words |
| Ctrl+Z / Cmd+Z | Undo |
| Ctrl+Shift+Z / Cmd+Shift+Z | Redo |
| Ctrl+S / Cmd+S | Save project |
| Ctrl+E / Cmd+E | Export |
| ? | Shortcut cheatsheet |
| Method | Endpoint | Description |
|---|---|---|
| GET | /health |
Health check |
| POST | /transcribe |
Transcribe media |
| POST | /jobs/transcribe |
Start transcription job |
| POST | /export |
Export edited video |
| POST | /jobs/export |
Start export job |
| GET | /jobs/{job_id} |
Read job progress, logs, result, or error |
| POST | /jobs/{job_id}/cancel |
Request job cancellation |
| POST | /jobs/{job_id}/retry |
Retry a failed or canceled job |
| POST | /ai/filler-removal |
Detect filler words |
| POST | /jobs/ai/filler-removal |
Detect filler words as a job |
| POST | /ai/create-clip |
Suggest clips |
| POST | /jobs/ai/create-clip |
Suggest clips as a job |
| POST | /ai/clip-metadata |
Suggest title, hook, caption, and hashtags |
| POST | /jobs/ai/clip-metadata |
Suggest clip metadata as a job |
| GET | /ai/ollama-models |
List local Ollama models |
| POST | /ai/9router-models |
List models exposed by 9Router |
| POST | /captions |
Generate captions |
| POST | /audio/clean |
Noise reduction |
| GET | /audio/capabilities |
Audio processing availability |
| GET | /background/capabilities |
Background removal availability |
Job statuses are queued, running, canceling, succeeded, failed, and canceled. A canceled job is retryable only after it leaves canceling and reaches final canceled.
Run npm run smoke:backend for fast backend smoke checks covering sidecar caption export settings, deleted-word caption filtering, and job cancellation lifecycle behavior. Run it alongside npm run lint, npm run build, and python -m compileall -q backend before release-oriented changes.
Start with docs/INSTALL.md, docs/DEVELOPMENT.md, and CONTRIBUTING.md. Use docs/TROUBLESHOOTING.md when setup or runtime checks fail.
MIT License. See LICENSE.
See ACKNOWLEDGEMENTS.md for original CutScript attribution.