WeftCut — видеоредактор, которым управляет ИИ-агент
📂 Исходный код на GitHubОткрытый нелинейный видеоредактор с MCP-сервером на localhost: агент управляет монтажом в запущенном проекте, а экранные элементы (Motifs) пишутся кодом и рендерятся как чистая функция времени.
Большинство видеоредакторов добавляют ИИ отдельной кнопкой. Есть генератор роликов, есть боковая панель, которая подсказывает, где резать. WeftCut сделан иначе: он отдаёт сам редактор агенту как набор инструментов.
Локальный MCP-сервер публикует все операции монтажа — поставить клип, обрезать, разрезать, поменять оформление, поставить ключевой кадр, собрать группу, добавить субтитры, выставить уровни звука, сделать отметку для отката. Агент, который у вас уже открыт, вызывает эти инструменты и правит проект, который вы в этот момент смотрите на экране.
Что это за продукт
WeftCut — настольный видеоредактор для Windows, macOS и Linux. Он бесплатный и открытый, лицензия MIT. Работает на Electron, ядро вычислений и декодирования написано на Rust, интерфейс и предпросмотр — на TypeScript.
Нейросетей внутри нет. Установщик не тащит за собой веса моделей. Локальные движки для распознавания речи и для разбора картинки скачиваются по желанию, когда они вам понадобятся. Всё остальное — редактор, который полезен и без агента: дорожки A/B-roll, ключевые кадры с редактором кривых, эффекты, субтитры, микшер звука с раздельными ролями, экспорт с ускорением на видеокарте.
Пока это ранняя версия. Авторы прямо пишут, что до версии 1.0.0 часть функций и внешний вид ещё могут поменяться.
Как начать
- Скачайте установщик для своей системы со страницы релизов.
- Установите приложение, откройте настройки и скопируйте оттуда промпт, который объясняет агенту, как подключиться к WeftCut.
- Вставьте промпт в Codex, Claude или любой другой клиент с поддержкой MCP.
Отдельно про macOS: установщик для этой системы пока не проверен, так что систему придётся разрешить вручную — System Settings → Privacy & Security → Open Anyway.
Агент работает с таймлайном, который вы смотрите
Ключевая идея проекта: агент не работает с копией проекта и не выгружает результат в файл. Он правит тот проект, который открыт у вас в редакторе. Вы видите каждое его действие на экране, пока идёт воспроизведение.
Остальное сделано так, чтобы агент не мешал человеку:
- Каждое действие попадает в журнал. Вызов инструмента становится строкой в панели Agent: «Обрезан клип · Ember.mp4», «Добавлен маркер · Нужно посмотреть». То же самое дублируется в строке состояния. Ничего не происходит вне записи.
- Любая пачка изменений откатывается. Агент ставит контрольные точки на логических границах работы, и каждую точку можно вернуть одним щелчком.
- Есть пробный прогон. Перед реальной работой агент может прогнать всю многошаговую правку на одноразовой копии проекта (
dry_run) и найти конфликт, не тронув ваши файлы. - Несколько агентов не мешают друг другу. Сессии привязаны к подключению. Агент, который сейчас работает, может взять блокировку истории (
set_history_lock), чтобы случайное Ctrl-Z не попало в середину его работы. Сама блокировка и причина, которую агент назвал, показываются вам.
Для длинных задач агент вызывает begin_agent_session, и тогда в окне остаётся только превью, прокрутка таймлайна и список текущих действий.
Код как видео: Motifs
Motif — это экранный элемент, написанный кодом. Это настоящая веб-страница: HTML, CSS, SVG, canvas, WebGL — что угодно, что вы готовы написать. Такая страница кладётся на таймлайн как слой.
Это не готовый пресет. Автор сам объявляет, какие у элемента есть настройки, а панель свойств в приложении собирает форму из этого объявления. То есть seconds, label и accent в примере ниже редактируются прямо в редакторе.
Одно правило превращает Motif в возможность редактора, а не в запись экрана: Motif рисуется как чистая функция времени. Он не двигается сам. Часы принадлежат программе, она прокручивает страницу до каждого кадра композиции, и один и тот же момент времени всегда даёт одну и ту же картинку — при прокрутке, при предпросмотре и при экспорте.
// The built-in Countdown's whole script, near enough verbatim — the rest of the
// file is the SVG ring it animates. S0 is whatever the manifest declares;
// S1 runs once per composition frame and keeps no state of its own.
motif.define({
setup: async function (props, ctx) {
_label = props.label != null ? String(props.label) : "GO";
num.style.color = props.accent;
ring.style.stroke = props.accent;
ring.setAttribute("stroke-dasharray", C);
ring.animate([{ strokeDashoffset: 0 }, { strokeDashoffset: C }],
{ duration: ctx.duration * 1000, easing: "linear", fill: "both" });
},
frame: function (t, ctx) {
var n = Math.max(0, Math.ceil(ctx.duration - t));
num.textContent = n > 0 ? String(n) : _label;
},
});
Мысль здесь простая: писать веб-страницы кодовые агенты умеют лучше всего на свете. Значит, вместо выбора готовой плашки из каталога агент может написать новую под ваш кадр. Инструкция по написанию Motifs встроена в приложение как обычный навык агента, так что модель получает нужные правила без того, чтобы вы вставляли документацию вручную.
Понятные применения — нижние плашки с именем, обратный отсчёт, текст караоке, анимированные заставки. Но предел здесь один: всё, что можно сделать на странице.
Под этим — обычный полноценный редактор
Всё, до чего может дотянуться агент, вы можете сделать руками. Ниже — что уже умеет сам редактор.
Таймлайн. Дорожки A/B-roll с раскадровками и звуковыми волнами, монтирование с точностью до кадра по стандарту SMPTE, удаление с закрытием промежутка, связка видео и звука, которая режется как один клип, группы слоёв через несколько дорожек, вложенные композиции.
Ключевые кадры. Анимируется любой параметр, есть плавность по кривым Безье, редактор кривых, управление касательными, пути движения и экстраполяция.
Речь и субтитры. Клип расшифровывается, и на дорожки субтитров ложатся редактируемые слои. Файлы SRT, VTT и ASS импортируются в медиатеку и попадают на таймлайн там, где начинается фрагмент. Расшифровка идёт через облачный сервис или полностью на вашей машине, если разрешить приложению скачать локальный движок (whisper.cpp, FunASR). Есть синтез речи для чернового озвучивания.
Звук. Микшер с раздельными ролями — речь, музыка, шумы, закадровый голос. У каждой роли свой индикатор уровня, своя громкость, своя панорама, свои затухания и шумоподавление. Функция Pauses сама находит мёртвые паузы в дубле и вырезает их одной отменяемой правкой, оставляя небольшой отступ, чтобы речь звучала естественно.
Разбор материала. Определение границ сцен, яркость, движение и резкость по каждому фрагменту, сравнение кадров и описания содержимого клиента моделью зрения. Агент может резать по смыслу, а не только по таймкоду.
Титры, эффекты, переходы. Текстовые слои с контурами, цепочки эффектов на слое, включая хромаке с пипеткой, которая берёт цвет прямо из кадра на экране, и переходы между клипами.
Экспорт. H.264, HEVC, AV1, программные и аппаратные кодировщики, настройка разрешения, частоты кадров и качества.
Поиск. Одна палитра Ctrl+K по командам, медиатеке, клипам, субтитрам и маркерам.
Стек
| Слой | Технологии |
|---|---|
| Оболочка | Electron 44 · TypeScript 7 · electron-vite · Vite 8 · Node 24 |
| Интерфейс | React 19 · Zustand · Immer · Tailwind CSS v4 · Base UI · shadcn/ui · Dockview · lucide · i18next (en-US / zh-CN) · fuzzysort |
| Предпросмотр | PixiJS v8 · WebGPU / WebGL · пул WebCodecs VideoDecoder · mediabunny · свои шейдеры YUV→RGB · часы на Web Audio |
| Экспорт | Worker + OffscreenCanvas · сборка YUV на GPU · чтение из PBO · rawvideo через IPC · нативный приёмник ffmpeg · кодировщик WebCodecs · mux с копированием потока |
| Ядро | Rust · napi-rs 3 · Tokio · imbl · serde · schemars · blake3 · reqwest · ffmpeg-sidecar |
| Декодирование | @weftcut/native-decode · ffmpeg-next · программная и GPU-ветки · sharedTexture (Windows) |
| Общая математика | библиотека weftcut-eval · native и wasm32 · привязка · вычисление ключевых кадров · огибающая · логика ролей |
| ffmpeg | GPL CLI как отдельный процесс (задачи, кодирование, сборка) · LGPL-библиотеки (декодирование внутри процесса) |
| Интерфейс для агента | MCP · streamable HTTP на localhost · @modelcontextprotocol/sdk · bearer-токен · каталог инструментов на TS и Rust |
| Motifs | Offscreen BrowserWindow · Chrome DevTools Protocol · схема motif: · CSP default-src 'none' |
| Речь и зрение | облачные провайдеры через reqwest · whisper.cpp · FunASR · модели по запросу |
| Тесты и CI | Vitest · cargo test · Playwright · node --test · Stryker · GitHub Actions (Windows / macOS / Linux) |
Принятые решения описаны в ADR.
Сборка из исходников
Понадобятся Node 24 или новее, Rust (стабильная версия через rustup) и C++-инструменты вашей системы. Команды для каждой ОС есть в docs/setup.md.
npm install # JS dependencies
npm run bootstrap # one-time: fetch ffmpeg + build the Rust addons
npm run dev # start the editor
Ещё пригодится: npm run typecheck, npm test, npm run e2e, npm run build, npm run package — последний собирает установщики.
Документация
Начните с architecture — там карта системы, и с MCP server & agent UX — про набор инструментов и поведение нескольких агентов. Механизм экранных элементов описан в Motifs и motif-authoring.
Остальное:
- Data model — схема состояния проекта, история изменений, сохранение, проверки.
- Render — рендерер на PixiJS и WebCodecs.
- Preview — окно предпросмотра и управление им.
- Export — настройки экспорта, звук, сборка итогового файла, прокси, фоновые задачи.
- Captions и Audio — загрузка субтитров и работа со звуком.
- Conformance — тестовые файлы и проверки совпадения кадров, синхронизации звука и цвета.
- Features — небольшие функции: область отмены, группы, палитра поиска, выбор цвета.
- Status / log system — шина сообщений внизу редактора.
- Licensing — MIT плюс две ветки FFmpeg и проверки лицензий при сборке.
- Цель v1 — что собираются успеть к первой версии. Папка
docs/описывает то, что работает уже сейчас.
Автор и лицензия
Проект ведёт UncleChair. Он объясняет, что делал WeftCut, чтобы ускорить собственную работу с видео: ему нужен был редактор, которым агент действительно может управлять, и таймлайн, который можно смотреть во время этой работы. Motifs выросли из второй половины этой задачи — нужные плашки оказалось проще написать, чем найти готовыми.
Организация WeftCut нужна только ради стабильного имени, домена и релизов. Работает над проектом один человек, и все задачи и pull request'ы попадают к нему.
Лицензия — MIT. Установщики содержат бинарники FFmpeg под их собственными лицензиями: LGPL-библиотеки для декодирования внутри процесса и GPL-командники, запускаемые отдельным процессом. Подробности — в THIRD-PARTY-NOTICES.md и docs/licensing.md.
Обсудить проект и получить помощь можно в Discord, а баги и новые функции лучше оставлять в GitHub Issues.
Источник: https://github.com/WeftCut/WeftCut