Clipper is an agentic video editor framework for TypeScript-authored motion graphics. It combines an Electron desktop shell, a Vite/React editor, and project-owned composition source files so motion graphics can be authored, previewed, organized, and exported from one local workspace.
Note: The app is still in development and is unsigned. I haven't bought the development certificate yet 😅
- TypeScript-authored composition sources using Clipper's component-oriented composition API.
- Desktop editor built with Electron, React, Vite, Tailwind CSS, Monaco Editor, and Zustand.
- Project file management for compositions, timelines, assets, and persisted editor state.
- Timeline editing for layered clips, motion markers, adjustment layers, selection, resizing, and playback previews.
- Media export pipeline with configurable resolution, frame rate, format, tiling, and worker settings.
- Cross-platform packaging through electron-builder for macOS, Windows, and Linux.
- Node.js 20 or newer is recommended.
- npm is used by the checked-in
package-lock.json. - A desktop environment capable of running Electron.
- Platform build prerequisites for
electron-builderwhen creating installers for macOS, Windows, or Linux.
Install dependencies:
npm installStart the desktop app in development mode:
npm run devThe development command starts the Vite renderer on 127.0.0.1:5173, watches the Electron main-process TypeScript build, waits for both targets, and then launches Electron.
npm run devstarts the full Electron development environment.npm run renderer:devstarts only the Vite renderer dev server.npm run electron:devruns the renderer, Electron TypeScript watcher, and Electron app together.npm run typechecktype-checks both renderer/project code and Electron code.npm run testruns the Vitest test suite.npm run icons:generateregenerates packaged application icons.npm run buildtype-checks, builds the Vite renderer intodist, and compiles Electron code intodist-electron.npm run distbuilds distributable packages with electron-builder.npm run dist:mac,npm run dist:win, andnpm run dist:linuxbuild platform-specific packages.
clipper/
├── clipper/ # Local app workspace: projects, exports, and persisted app state
├── electron/ # Electron main process, preload scripts, and render/export engine
├── src/ # React renderer application
│ ├── app/ # App state, project services, feature controllers, and editor logic
│ ├── components/ # Shared editor UI components
│ ├── core/ # Pure timeline, composition, export, and render domain helpers
│ ├── lib/ # Shared utility modules
│ ├── App.tsx # Renderer app entry component
│ ├── main.tsx # React renderer bootstrap
│ └── styles.css # Tailwind and global styles
├── scripts/ # Maintenance scripts such as icon generation
├── build/ # Packaging resources and generated icons
├── agent-log/ # Versioned project plans and implementation memory
├── electron-builder.config.cjs # Packaging configuration
├── vite.config.ts # Vite, Vitest, Tailwind, and dev filesystem bridge configuration
├── tsconfig.json # Renderer and project TypeScript configuration
└── tsconfig.node.json # Electron TypeScript configuration
Composition source files live in the project workspace under clipper/projects. They should use Clipper's component-oriented TypeScript authoring style with new Composition({ render() { return [...] } }) and renderable classes such as Component, Group, Rect, Text, and Chart.
Do not author public composition sources as normalized object-list JSON. The normalized CompositionClip.objects representation is internal editor/runtime state.
Run a production build before packaging:
npm run buildCreate distributable packages for the current platform:
npm run distPlatform-specific packaging commands are available with npm run dist:mac, npm run dist:win, and npm run dist:linux. Packaging is configured in electron-builder.config.cjs with app id app.clipper.editor, product name Clipper, and build resources from build/electron.
Generated build output is written to dist and dist-electron; packaged artifacts are produced by electron-builder according to its default output conventions and the local platform/toolchain.
Contributions are welcome. To keep the project maintainable:
- Keep changes focused and minimal.
- Run
npm run typecheckandnpm run testbefore opening a pull request. - Reuse existing React components and themed UI primitives where possible.
- Keep shared editor/project state in the existing scoped Zustand stores instead of adding deep prop chains.
- Place reusable domain logic in
src/coreor focused modules undersrc/apprather than growing large React components. - Add effects through package manifests, logic modules, category/timeline metadata, post-process declarations, and in-process registry APIs documented in
docs/EFFECT_PACKAGES.md; do not hardcode effect-specific UI/timeline/export branches or imply an npm/plugin loader exists. - Preserve the class/render-based composition authoring API for project-owned source files.
- Update the relevant versioned memory file under
agent-log/when making project changes.
Clipper is licensed under the MIT License. See LICENSE for details.
