{"id":48719679,"url":"https://github.com/elliotttate/splicekit","last_synced_at":"2026-04-20T23:05:44.473Z","repository":{"id":348066600,"uuid":"1196334935","full_name":"elliotttate/SpliceKit","owner":"elliotttate","description":"Direct in-process control of Final Cut Pro via dylib injection and MCP server","archived":false,"fork":false,"pushed_at":"2026-04-16T02:52:20.000Z","size":20642,"stargazers_count":42,"open_issues_count":28,"forks_count":7,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-16T03:30:54.529Z","etag":null,"topics":["fcp","fcpx","fcpxml","finalcutpro"],"latest_commit_sha":null,"homepage":"https://splicekit.fcp.cafe","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elliotttate.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-30T15:45:29.000Z","updated_at":"2026-04-16T02:52:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/elliotttate/SpliceKit","commit_stats":null,"previous_names":["elliotttate/fcpbridge","elliotttate/splicekit"],"tags_count":39,"template":false,"template_full_name":null,"purl":"pkg:github/elliotttate/SpliceKit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elliotttate%2FSpliceKit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elliotttate%2FSpliceKit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elliotttate%2FSpliceKit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elliotttate%2FSpliceKit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elliotttate","download_url":"https://codeload.github.com/elliotttate/SpliceKit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elliotttate%2FSpliceKit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31954738,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fcp","fcpx","fcpxml","finalcutpro"],"created_at":"2026-04-11T19:07:38.433Z","updated_at":"2026-04-18T03:03:52.756Z","avatar_url":"https://github.com/elliotttate.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SpliceKit\n\nWelcome to **SpliceKit**!\n\nSpliceKit gives superpowers to Apple's Final Cut Pro.\n\nIf you're a video editor, the best place to get started is the official [SpliceKit website](https://splicekit.fcp.cafe). Definitely check out the [FAQ](https://splicekit.fcp.cafe/faq/) for an easier explanation of some of what SpliceKit can do. \n\nYou can also join us on [FCP Cafe](https://fcp.cafe) in the SpliceKit [Discord channels](https://discord.com/invite/HD3FPc4Azu) for help, questions, or feature requests. \n\nFor bug reports please [open a GitHub Issue](https://github.com/elliotttate/SpliceKit/issues).\n\nWe can't wait to see what you do with SpliceKit!\n\nOnwards \u0026 Upwards! 🥳\n\n---\n\n## Built-in Features\n\n### Transcript Editor — Text-Based Video Editing\n\n[![Transcript Editor Demo](https://img.youtube.com/vi/JxxDSH4Ly0I/maxresdefault.jpg)](https://www.youtube.com/watch?v=JxxDSH4Ly0I)\n\n\u003e Click a word to jump the playhead. Select words and press Delete to remove video segments. Drag words to reorder clips. All changes apply directly to the FCP timeline.\n\nPowered by **NVIDIA Parakeet TDT 0.6B** (on-device via FluidAudio) with v3 multilingual (25 languages) as the default engine and v2 English-optimized as an option. Speaker diarization identifies who's speaking. All clips are transcribed in a single batch process for speed.\n\n### Command Palette — Apple Intelligence for Final Cut Pro\n\nHit **Cmd+Shift+P** inside the modded FCP to open a VS Code-style command palette with fuzzy search across 100+ editing actions. Type what you want to do in plain English and Apple Intelligence (on-device LLM via FoundationModels) translates your intent into editing actions.\n\n**Built-in commands include:**\n\n- **Editing**: Blade, delete, cut/copy/paste, trim, nudge, compound clips, detach audio, lift/overwrite, create storylines\n- **Playback**: Play/pause, frame stepping, go to start/end, loop, play selection, JKL-style controls\n- **Color**: Color Board, Color Wheels, Color Curves, Hue/Saturation, auto-enhance, match color, balance color\n- **Speed**: Normal, 2x/4x/8x/20x fast, 50%/25%/10% slow, reverse, freeze frame, hold frame\n- **Markers**: Standard, to-do, and chapter markers with navigation\n- **Effects \u0026 Transitions**: Browse, search, and apply any effect, transition, generator, or title by name\n- **Audio**: Volume up/down, fade in/out, audio enhancements, **Remove Silences** (auto-detects and removes silent segments)\n- **Scene Detection**: Analyze video for shot boundaries and automatically add markers or blade at every scene change\n- **Transform**: Crop, distort, reframe, stabilize\n- **Multicam**: Switch and cut angles 1-4, create multicam clips\n- **Captions**: Add/import captions and subtitles\n- **Ratings \u0026 Roles**: Favorite, reject, role assignment\n- **View**: Zoom to fit, snapping, skimming, timeline index, inspector\n- **Export**: Render, share selection, export FCPXML\n\n**Natural language examples you can ask Apple Intelligence:**\n\n- *\"add markers every 5 seconds\"*\n- *\"slow this clip to half speed\"*\n- *\"add a cross dissolve\"*\n- *\"color correct this clip\"*\n- *\"blade at every scene change\"*\n- *\"remove all the silences\"*\n- *\"zoom to fit the timeline\"*\n\nThe AI understands your intent, maps it to the right sequence of FCP actions, and executes them — all without leaving the keyboard.\n\n**Remove Silences** uses Apple-native AVFoundation + Accelerate (vDSP) to analyze audio and detect silent segments. No ffmpeg or external dependencies. An options panel lets you configure the detection threshold, minimum silence duration, and padding. The audio analysis runs in the background with a processing indicator, then silences are bladed and ripple-deleted from the timeline.\n\n**Scene Detection** uses histogram-based frame comparison via the Accelerate framework's vImage to detect cuts and shot changes. Configurable sensitivity and sample interval. Markers are inserted programmatically at exact timecodes — no playhead movement required — making it fast even on long sequences.\n\n---\n\n## What This Does\n\nSpliceKit injects a dynamic library into a re-signed copy of Final Cut Pro that:\n\n- Exposes the entire ObjC runtime (78,000+ classes, including all private APIs)\n- Runs a JSON-RPC 2.0 server on `127.0.0.1:9876` for external control\n- Provides an MCP server for AI-assisted FCP automation\n- Swizzles out CloudKit/ImagePlayground calls that crash without iCloud entitlements\n- Gives direct access to Flexo, Ozone, TimelineKit, LunaKit, and all internal frameworks\n\n---\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────┐\n│  Final Cut Pro (modded copy)                    │\n│  ┌───────────────────────────────────────────┐  │\n│  │  SpliceKit.framework (injected via        │  │\n│  │  LC_LOAD_DYLIB)                           │  │\n│  │                                           │  │\n│  │  - ObjC runtime introspection             │  │\n│  │  - JSON-RPC server on TCP :9876           │  │\n│  │  - Method swizzling                       │  │\n│  │  - CloudContent crash prevention          │  │\n│  └───────────┬───────────────────────────────┘  │\n│              │ direct objc_msgSend              │\n│  ┌───────────▼───────────────────────────────┐  │\n│  │  Flexo, Ozone, TimelineKit, LunaKit ...  │  │\n│  │  (78,000+ ObjC classes)                   │  │\n│  └───────────────────────────────────────────┘  │\n└──────────────────────┬──────────────────────────┘\n                       │ TCP :9876\n        ┌──────────────▼──────────────┐\n        │  MCP Server (mcp/server.py) │\n        │  Python Client              │\n        │  nc / curl / any TCP client │\n        └─────────────────────────────┘\n```\n\n---\n\n## Quick Setup\n\n### GUI Patcher (Recommended)\n\n[![Installation Guide](https://img.youtube.com/vi/NxbInKlXQVs/maxresdefault.jpg)](https://www.youtube.com/watch?v=NxbInKlXQVs)\n\nDownload **SpliceKit** from the [latest release](https://github.com/elliotttate/SpliceKit/releases/latest), unzip it, and run the app. It handles everything automatically — just click the button to patch.\n\n\u003cimg src=\"docs/patcher-screenshot.jpg\" width=\"500\" alt=\"SpliceKit Patcher\"\u003e\n\nThe patcher will:\n1. Copy Final Cut Pro to `~/Applications/SpliceKit/`\n2. Build and inject the SpliceKit dylib\n3. Re-sign with custom entitlements (no sandbox)\n4. Patch crash points (CloudContent/ImagePlayground)\n5. Set up the MCP server config\n\nOnce patched, click **Launch FCP** in the patcher or open the modded app directly.\n\n### Command Line Patcher\n\nAlternatively, use the shell script:\n\n```bash\ngit clone https://github.com/elliotttate/SpliceKit.git\ncd SpliceKit\n./patcher/patch_fcp.sh\n```\n\nOptions:\n```bash\n./patcher/patch_fcp.sh --dest ~/my-fcp    # Custom destination\n./patcher/patch_fcp.sh --rebuild           # Rebuild dylib only (after code changes)\n./patcher/patch_fcp.sh --uninstall         # Remove the modded copy\n```\n\n---\n\n## Manual Setup\n\n### Prerequisites\n\n- macOS 14+ with Xcode Command Line Tools\n- Final Cut Pro installed at `/Applications/Final Cut Pro.app`\n- Python 3 with `mcp` package (`pip install mcp`)\n\n### 1. Create the Modded Final Cut Pro Copy\n\n```bash\n# Copy FCP\nmkdir -p ~/Applications/SpliceKit\ncp -R \"/Applications/Final Cut Pro.app\" ~/Applications/SpliceKit/\"Final Cut Pro.app\"\n\n# Copy MAS receipt (needed for licensing)\ncp \"/Applications/Final Cut Pro.app/Contents/_MASReceipt/receipt\" \\\n   ~/Applications/SpliceKit/\"Final Cut Pro.app/Contents/_MASReceipt/receipt\"\n\n# Remove quarantine\nxattr -cr ~/Applications/SpliceKit/\"Final Cut Pro.app\"\n```\n\n### 2. Build and Inject SpliceKit\n\n```bash\n# Build the dylib\nmake all\n\n# Deploy to the modded app (creates framework, signs everything)\nmake deploy\n\n# Inject LC_LOAD_DYLIB into the binary (requires insert_dylib)\n# Build insert_dylib: git clone https://github.com/tyilo/insert_dylib.git \u0026\u0026 cd insert_dylib \u0026\u0026 clang -o /usr/local/bin/insert_dylib insert_dylib/main.c -framework Foundation\ninsert_dylib --inplace --all-yes \\\n    \"@rpath/SpliceKit.framework/Versions/A/SpliceKit\" \\\n    ~/Applications/SpliceKit/\"Final Cut Pro.app\"/Contents/MacOS/\"Final Cut Pro\"\n\n# Re-sign with a local codesigning identity when available, otherwise ad-hoc\nSIGN_IDENTITY=\"$(security find-identity -v -p codesigning 2\u003e/dev/null | awk '/\"Apple Development:/ { print $2; exit } /\"Developer ID Application:/ \u0026\u0026 developer == \"\" { developer = $2 } /[0-9]+\\) [0-9A-F]+ \"/ \u0026\u0026 first == \"\" { first = $2 } END { if (developer != \"\") print developer; else if (first != \"\") print first }')\"\ncodesign --force --sign \"${SIGN_IDENTITY:--}\" --entitlements entitlements.plist \\\n    ~/Applications/SpliceKit/\"Final Cut Pro.app\"\n```\n\n### 3. Launch\n\n```bash\n~/Applications/SpliceKit/\"Final Cut Pro.app\"/Contents/MacOS/\"Final Cut Pro\"\n```\n\nCheck `~/Library/Logs/SpliceKit/splicekit.log` for startup messages. You should see:\n```\n[SpliceKit] Control server listening on 127.0.0.1:9876\n```\n\n---\n\n## Usage\n\n### Python Client (Interactive REPL)\n\n```bash\npython3 Scripts/splicekit_client.py\n```\n\n```\nsplicekit\u003e version\nsplicekit\u003e classes FFAnchored\nsplicekit\u003e methods FFPlayer\nsplicekit\u003e props FFAnchoredSequence\nsplicekit\u003e super FFAnchoredSequence\nsplicekit\u003e ivars FFLibrary\n```\n\n### Direct TCP\n\n```bash\necho '{\"jsonrpc\":\"2.0\",\"method\":\"system.version\",\"id\":1}' | nc 127.0.0.1 9876\n```\n\n### MCP Server\n\nFirst, create a Python virtual environment for the MCP server and install the `mcp` package:\n\n```bash\npython3 -m venv ~/.venvs/splicekit-mcp\n~/.venvs/splicekit-mcp/bin/python -m pip install --upgrade pip mcp\n```\n\nUse the virtual environment's Python as the MCP `command`.\n\n#### From a repository checkout\n\nIf you cloned this repository locally, point MCP at the repo copy of `mcp/server.py`:\n\n```json\n{\n  \"mcpServers\": {\n    \"splicekit\": {\n      \"command\": \"/Users/yourname/.venvs/splicekit-mcp/bin/python\",\n      \"args\": [\"/absolute/path/to/SpliceKit/mcp/server.py\"]\n    }\n  }\n}\n```\n\n#### From the packaged installer\n\nIf you installed SpliceKit using the packaged app, point MCP at the server script inside the installed SpliceKit app bundle:\n\n```json\n{\n  \"mcpServers\": {\n    \"splicekit\": {\n      \"command\": \"/Users/yourname/.venvs/splicekit-mcp/bin/python\",\n      \"args\": [\"/Applications/SpliceKit.app/Contents/Resources/mcp/server.py\"]\n    }\n  }\n}\n```\n\nNotes:\n- The MCP server connects to the SpliceKit bridge running inside Final Cut Pro on `127.0.0.1:9876`, so the modded Final Cut Pro must be running.\n\n---\n\n## JSON-RPC API\n\n| Method | Description |\n|--------|-------------|\n| `system.version` | SpliceKit + FCP version info |\n| `system.getClasses` | List/filter all ObjC classes |\n| `system.getMethods` | List methods on a class |\n| `system.getProperties` | List @property declarations |\n| `system.getIvars` | List instance variables |\n| `system.getProtocols` | List protocol conformances |\n| `system.getSuperchain` | Get inheritance chain |\n| `system.callMethod` | Call any ObjC class/instance method |\n\n### Key FCP Internal Classes\n\n| Class | Methods | Purpose |\n|-------|---------|---------|\n| `FFAnchoredTimelineModule` | 1435 | Primary timeline controller |\n| `FFAnchoredSequence` | 1074 | Timeline data model |\n| `FFLibrary` | 203 | Library container |\n| `FFLibraryDocument` | 231 | Library persistence |\n| `FFEditActionMgr` | 42 | Edit command dispatcher |\n| `FFPlayer` | 228 | Playback engine |\n| `PEAppController` | 484 | App controller |\n\n### Key FCP Frameworks\n\n| Prefix | Framework | Classes | Purpose |\n|--------|-----------|---------|---------|\n| FF | Flexo | 2849 | Core engine, timeline, editing |\n| OZ | Ozone | 841 | Effects, compositing, color |\n| PE | ProEditor | 271 | App controller, windows |\n| LK | LunaKit | 220 | UI framework |\n| TK | TimelineKit | 111 | Timeline UI |\n| IX | Interchange | 155 | FCPXML import/export |\n\n---\n\n## How It Works\n\n1. **App duplication**: Final Cut Pro is copied to a writable location\n2. **Re-signing**: Ad-hoc signature with entitlements that disable library validation and sandbox\n3. **Binary patching**: `insert_dylib` adds an `LC_LOAD_DYLIB` command pointing to `SpliceKit.framework`\n4. **Auto-load**: On launch, dyld loads SpliceKit before `main()` runs\n5. **Constructor**: `__attribute__((constructor))` caches class references and swizzles CloudContent\n6. **Server start**: On `NSApplicationDidFinishLaunchingNotification`, starts TCP server on port 9876\n7. **Runtime access**: All calls use `objc_getClass()`, `objc_msgSend()`, and the ObjC runtime API\n\n---\n\n## Project Structure\n\n```\nSpliceKit/\n├── patcher/\n│   ├── SpliceKitPatcher.app/  # Signed \u0026 notarized GUI patcher\n│   ├── SpliceKitPatcher/\n│   │   └── main.swift         # Patcher source (SwiftUI)\n│   └── patch_fcp.sh           # Command line patcher\n├── Sources/\n│   ├── SpliceKit.h            # Public header\n│   ├── SpliceKit.m            # Constructor, class caching, crash fixes, menu/toolbar\n│   ├── SpliceKitRuntime.m     # ObjC runtime utilities\n│   ├── SpliceKitServer.m      # JSON-RPC TCP server (33 tool endpoints)\n│   ├── SpliceKitSwizzle.m     # Method swizzling infrastructure\n│   ├── SpliceKitTranscriptPanel.h   # Transcript editor header\n│   ├── SpliceKitTranscriptPanel.m   # Speech transcription, text-based editing UI\n│   ├── SpliceKitCommandPalette.h    # Command palette header\n│   └── SpliceKitCommandPalette.m    # Cmd+Shift+P palette with Apple Intelligence + 100 commands\n├── tools/\n│   ├── silence-detector.swift       # Audio silence detection CLI (AVFoundation + vDSP)\n│   └── parakeet-transcriber/        # On-device speech-to-text CLI (NVIDIA Parakeet via FluidAudio)\n├── Scripts/\n│   ├── splicekit_client.py    # Interactive Python REPL client\n│   └── launch.sh              # Launch helper script\n├── mcp/\n│   └── server.py              # MCP server (33 tools)\n├── docs/\n│   └── FCP_API_REFERENCE.md   # Full API reference for FCP internals\n├── CLAUDE.md                  # Skill documentation for Claude\n├── Makefile                   # Build, deploy, launch targets\n├── entitlements.plist         # Unsandboxed entitlements for re-signing\n└── LICENSE                    # MIT License\n```\n\n---\n\n## Is This Legal / Safe to Use?\n\nA few things worth clarifying up front -- this isn't for everyone, but it's very easy to set up if you do want to try it.\n\n**On reverse engineering and the EULA:** Reverse engineering for interoperability is explicitly protected under the DMCA ([17 U.S.C. § 1201(f)](https://www.law.cornell.edu/uscode/text/17/1201)) and similar laws in the EU. This is the same legal basis that allows tools like Homebrew, Hammerspoon, and countless other macOS utilities that hook into Apple apps. Apple's EULA doesn't override federal law. That said, SpliceKit doesn't really involve reverse engineering in the traditional sense -- once the library is loaded, Final Cut Pro exposes all of its own classes and methods through the Objective-C runtime. There's no decompilation required.\n\n**On \"injecting code\":** What SpliceKit does is no different from what accessibility tools, screen readers, and automation utilities do every day on macOS. `DYLD_INSERT_LIBRARIES` is a documented Apple mechanism -- it's not an exploit. Apps like BetterTouchTool, Alfred, and Bartender all inject into running processes using the same techniques.\n\n**On Apple disabling your Apple ID:** There is no precedent for Apple disabling an Apple ID for running a modified local app. Apple can't even distinguish between \"ran a modded app\" and \"loaded a dylib for debugging in Xcode,\" which developers do constantly. Apple's focus is on protecting the App Store and code signing for distribution -- not policing what developers do on their own machines.\n\n**The real risk** is the same as any unsigned software: make sure you trust the source. The code is fully open, the techniques are well-established, and nothing here is novel or dangerous from a security perspective.\n\nOn a personal note -- I've been frustrated by how little progress Final Cut Pro has made over the years, and my hope is that this project can help it finally get some of the features it desperately needs. There's a huge precedent in modding software and games. I've modded quite a few games where the developers officially adopted features based on community work. It can be a really productive relationship where proof of concepts demonstrate what would be genuinely useful to add officially.\n\n---\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felliotttate%2Fsplicekit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felliotttate%2Fsplicekit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felliotttate%2Fsplicekit/lists"}