← Интерфейсы и исследования

Osmo Studio: что это и как сделать такой редактор себе (2026-08-15)

Повод: Леонид заметил, что Osmo ложится в наш конвейер. Источники: публичные страницы osmo.inc, скриншоты studio.osmo.inc от 15.08.2026 (тарифы и онбординг — их нет в открытом HTML, страницы отдают SPA) и разбор агента по архитектуре.

Что это

«AI-native видеоредактор, где видео собрано как редактируемый код». Собственное описание: «Turn ideas, Figma files, and footage into polished, on-brand animations, built as editable code». Позиционируют себя студией для сторителлеров, целевой сценарий — продуктовые лончи и моушн-графика, прямой конкурент After Effects и Jitter (у них отдельные guides «osmo vs after effects», «after effects alternatives for teams», «jitter alternatives»).

Заголовок в интерфейсе: «Create stunning animations with natural language», шапка стилизована под техническую выдачу (RESOLUTION 4K UHD · FRAME RATE 60.00 FPS · CODEC H.265 · COLOR REC.709 · STATUS: ONLINE).

Тарифы: гейтинга функций нет вообще

ПланСтавкаЦена
Basic1× usage$19/мес
Pro (most popular)5× usage$60/мес, «save 37%»
Max (best value)12× usage«save 43%»

Первые 7 дней бесплатно (промокод OSMOSTART), годовая оплата −25%.

Ключевое решение — «Every feature, on every plan»: полный редактор входит во все тарифы, план меняет только ставку за использование. Во всех планах: полный редактор (таймлайн, кейфреймы, easing, камера), экспорт 4K ProRes с прозрачным фоном, генерация SFX/музыки/озвучки, импорт Figma-фреймов и SVG «мгновенно редактируемыми», общие бренд-киты и библиотеки, реалтайм-совместная работа, воркспейсы, доступ в Slack-сообщество.

Это третий путь между «коины» и «функции по подписке»: платишь за объём вычислений, а не за право пользоваться инструментом. Для нас интересно как контрмодель к duanju-коинам.

Онбординг: анкета из 6 шагов

Прогресс-полоса, один вопрос на экран, 6–9 крупных «таблеток», кнопки Back / Continue. Вопросы:

Почему это хороший онбординг: каждый вопрос — сегментация, которая окупается тут же (откуда мигрировать → какие шаблоны показать; кодинг-инструменты → включать ли код-режим), а не анкета ради анкеты. Последний вариант всегда даёт честный выход («I don't vibe code»), поэтому не раздражает. Ответы — крупные кнопки, проходится большим пальцем за секунды. Записано в память как образец для родительского онбординга TikBook.

Как это устроено внутри (реверс продакшн-бандла)

Разобран studio.osmo.inc/assets/index-*.js (11,7 МБ) — ниже только то, что видно в коде.

Формат сцены — TSX-файл, экспортирующий React-компонент. Не JSON и не свой DSL. В браузере транспилируется Sucrase, исполняется в песочнице new Function с белым списком ровно из трёх модулей.

Главная находка: remotion и @engine/core — это один и тот же объект. Osmo не использует Remotion как рантайм — они написали свой движок и заалиасили под него имя remotion, чтобы TSX, который пишет модель (обученная на Remotion), просто работал без переучивания. Их API — надмножество Remotion: сверху добавлены Mesh, Model, Shader, Particles, Path, Mask.

Рендерер свой, на Rust/WASM + WebGPU. В бандле лежит engine_bg-*.wasm с экспортами engine_render, engine_add_svg, engine_shader_errors, engine_set_transparent и кастомный React-reconciler с host-контекстом "eng": React рендерит не в DOM, а в WASM-движок. Экспорт видео — тоже целиком в браузере через WebCodecs (h264/h265/vp9/av1/ProRes, ProRes отдельным WASM с пулом воркеров). Для них это COGS ≈ 0 на рендер, ценой требования к железу пользователя.

Документ проекта — CRDT (Loro). Отсюда реалтайм-совместная работа и история версий.

LLM — Claude через AWS Bedrock (Haiku 4.5, Sonnet 4.6, Opus 4.6–4.8) плюс Gemini, по умолчанию модель выбирает классификатор под задачу. Схема мультиагентная: director ведёт диалог, specialist («code-animation specialist») пишет TSX, отдельные воркеры на изображения, видео (Seedance), TTS/SFX/музыку (ElevenLabs) — со счётом стоимости по каждой роли.

Figma → TSX идёт БЕЗ модели, детерминированным конвертером (их собственный тултип: «no LLM»). LLM подключается уже для анимации.

Бренд — это agent-skill: сущность library с полями tokens (цвета, типографика, motion, spacing, radii), designMd (гайдлайны прозой), usage (когда применять) и флагом autoLoadForAgent. Плюс тул web_inspect, который вытягивает бренд прямо с сайта.

API, SDK и open source отсутствуют. GitHub-организации нет, npm-пакетов нет, /api/* за авторизацией, MCP только внутренний. Встроить их движок в свой конвейер сейчас невозможно; ближайший встраиваемый эквивалент — сам Remotion.

Деньги: $5M seed под лидом Bain Capital Ventures, анонс 5 августа 2026 одновременно с GA продукта; среди ангелов Скотт Белски (экс-CPO Adobe). Не YC. Тарифы точнее, чем на скриншоте: Basic $19, Pro $60 ($45 при годовой), Max $130 ($100), Enterprise по запросу.

Главный урок для нас: контролы важнее генерации

Самое ценное в их архитектуре — не WebGPU и не CRDT, а разделение труда:

Модель пишет код один раз и вместе с ним декларирует панель контролов для каждого параметра. Все последующие правки идут через значения контролов и кейфреймы — без обращения к модели.

Схема контрола у них: {key, label, kind, default, min, max, step, group}, где kind — number, color, boolean, select, xyPad. Кейфреймить можно и значения этих контролов.

Отсюда две вещи, которые мы можем забрать, не строя ничего похожего на их движок:

  1. 1. Правка должна быть бесплатной и мгновенной. Если каждое «сделай паузу подлиннее» уходит в LLM, редактор будет медленным и дорогим. Модель должна один раз сказать, что в этой сцене можно крутить и в каких границах, а дальше человек крутит сам.
  2. 2. Проектировать API под то, что модель уже знает. Их трюк с алиасом remotion — про это: не изобретать свой DSL, если модель уже обучена на существующем. У нас это значит: схему сцены держать близкой к тому, что модель порождает естественно, и не плодить экзотических полей.

Как это ложится на наш конвейер

Ключевое совпадение: у нас видео уже описано данными, а не таймлайном. episodes.json — это сцены с длительностями, keyframe_prompt, motion, репликами и loc; tools/assemble.py (216 строк) собирает из этого mp4 прямыми вызовами ffmpeg. То есть «видео как редактируемый код» у нас фактически уже есть — не хватает редактора поверх этого представления.

Чего сегодня нет: правки без перегенерации всего, превью до рендера, и человеческого контура — редактор смотрит constory-report.json в одном окне, а видео в другом.

Что строить: не копия Osmo, а редактор сезона

Osmo решает задачу «сделать красивый ролик с нуля». У нас другая: править уже сгенерированный сезон, не ломая проверяемость. Поэтому копировать надо не продукт, а три его решения.

Решение 1: единственный источник правды — данные, рендер вторичен

У нас это уже так. Правило, которое надо удержать: редактор правит episodes.json, а не смонтированный файл. Любая правка обязана проходить те же ворота (verify, constory), иначе редактор станет дырой в контуре качества.

Решение 2: правка естественным языком поверх структуры

У Osmo — «create animations with natural language». У нас эквивалент уже написан: showrunner патчит VO-строки точечными диффами, repair чинит по отчёту. Не хватает интерактивности: сказать «во второй сцене эпизода 4 сделай паузу перед репликой Сильвера» и увидеть результат.

Решение 3: превью дешевле рендера

Самое ценное. Kling-рендер минуты и стоит денег; поэтому редактор должен показывать аниматик — кейфреймы + тайминги + озвучка, без видеогенерации. У нас для этого уже есть tools/animatic.py (92 строки).

Предложение: pipeline.py edit --book <slug>

Локальный веб-редактор одной командой, на том же стеке, что и остальное (stdlib + ffmpeg), без нового сервиса в эксплуатации.

Экран — три колонки:

  1. 1. Сезон слева: 10 эпизодов, под каждым сцены; цветом — состояние ворот (цитаты, крючки, противоречия constory). Клик по сцене — переход.
  2. 2. Превью в центре: аниматик текущей сцены (кейфрейм + субтитр + озвучка), кнопка «пересобрать эпизод». Рендер видео — отдельной кнопкой, потому что он платный.
  3. 3. Правка справа: поля сцены (длительность, motion, keyframe_prompt, реплики с loc), рядом — находки constory и verify именно для этой сцены. Плюс строка «попросить»: текстовая правка, которая уходит в LLM с контекстом одной сцены и возвращает диф, а не переписанный текст.

Инварианты, без которых редактор вреден:

Порядок работ:

  1. 1. Читалка: собрать существующий admin.html в интерактивный вид (эпизоды → сцены → находки). Половина кода уже есть в stages/admin.py.
  2. 2. Аниматик в браузере: tools/animatic.py уже собирает превью — обернуть в страницу с плеером.
  3. 3. Правка полей + мгновенный verify по изменённой сцене.
  4. 4. Строка «попросить» → диф от LLM → применение с подтверждением.
  5. 5. Кнопка рендера конкретной сцены (не сезона).

Чего не делать: таймлайна с кейфреймами и кривыми easing. Это ядро Osmo и месяцы работы, а нам не нужно: у нас не моушн-графика, а нарезка книги, где движение задаётся одной строкой motion и генератором видео.

Разбор UX: где в чужих таймлайнах живёт промпт (15.08.2026)

Отдельное исследование по 15+ продуктам. Три вывода, ради которых стоило копать.

1. Промпт на клипе таймлайна не печатает почти никто. Как только материал попадает на монтажный таймлайн, промпт перестаёт быть адресуемым — у Runway, Descript, Morphic, Kapwing, CapCut, Adobe Firefly. Живых исключений два: Neural Frames (у них фича так и называется — «Prompt timeline») и Higgsfield Cinema Studio (шот-боксы, но до генерации). Flora решает косвенно — клип помнит ноду-источник. То есть наша схема оказалась не копией чужого решения, а незанятым местом.

2. Sora storyboard, канонический референс, больше не существует — веб и приложение выключены 26 апреля 2026. Его ментальная модель («промпты как кейфреймы», расстояние между карточками = бюджет модели на переход) осталась только в туториалах.

3. У паттерна есть каноническое имя — «prompt details» (каталог Shape of AI: «показывать детали промпта рядом с артефактом»), но к оси времени его никто не применил. Термин prompt track свободен полностью.

Что стоило украсть — и что я забрал

РешениеОткудаВзято
Состояние генерации показано цветом в самом объекте, плюс явная операция «запечь», рвущая связь с промптомDescript (десять цветовых состояний прямо в тексте скрипта)да — полоса на клипе: свежий / устарел / не собран
Клип помнит источник, из которого сделанFlora «Go to Node»да — через provenance.jsonl
Стоимость показана до подтвержденияHiggsfield (на кнопке), Flora (тултип), Kapwing (Plan mode)частично — показываем billable-единицы, а не доллары
Четвёрка полей шота: кадр, описание, движение камеры, репликаLTX Studioуже совпадало с нашей схемой
Точечная перегенерация панелиLTX («tap any panel to regenerate»)в плане
Лента версий промпта с закреплённым оригиналомRunway Edit Studioв плане
Расстояние между карточками как параметр связностиSoraне наш случай (у нас непрерывный монтаж)

Negative prompt в индустрии мёртв (нет ни у Runway, ни у Krea, ни у Flora, ни у Morphic, ни у Higgsfield, ни у CapCut), seed почти мёртв — остался у Flora и выключенным чекбоксом у Runway. Движение камеры почти везде пишется прозой. Это подтверждает нашу схему: не плодить поля.

Два незанятых места, отмеченных исследованием. Первое — пустые состояния: никто не даёт разложить N пустых карточек и заполнять их, хотя для книги, где структура глав известна заранее, планируемая сетка пустых шотов очевидна. Второе — то, на чём остановился Descript: обещание «правь текст — медиа следует» доходит до звуковой волны и дальше не идёт, потому что слои архитектурно вне script track. Клип, у которого промпт живёт на нём самом и передеривирует результат — честное продолжение их идеи туда, куда они её не понесли.

Что в итоге построено

tools/editor.py → https://dev.dinershtein.com. Плеер, линейка, дорожка кадров с миниатюрами, дорожка речи, инспектор сцены; плейхед синхронизирован с видео, клик по клипу перематывает, пробел и стрелки работают.

Три вещи, которых нет ни у кого из разобранных:

  1. 1. Цена правки видна до клика — поля разделены цветом: зелёные (длительность, камера, реплики) меняют только параметры сборки, оранжевые (промпт кадра) требуют перегенерации.
  2. 2. Расхождение промпта и картинки — редактор сравнивает текущий промпт с тем, которым сцена реально отрендерена (из provenance.jsonl), и помечает клип устаревшим, показывая в инспекторе, чем он сделан на самом деле. Проверено подделкой правки: сцена s08 корректно определилась как устаревшая.
  3. 3. Тайминг по факту, а не по плану — длительности берутся из собранных клипов; на «Острове сокровищ» это вскрыло расхождение с планом в 1,6 с, из-за которого плейхед показывал бы не ту сцену.
  4. 4. Итоговый промпт — панель показывает текст, который реально уйдёт в модель, а не тот, что видит человек: у нас к промпту приклеивается стилевой префикс, а наличие референса персонажа меняет саму модель (flux-pulid против flux/dev). Приём взят у ComfyUI-MiniMaxH3-Director (панель COMPILED PROMPT). Константы читаются прямо из tools/generate.py, чтобы редактор не разъехался с генератором.

Что ещё стоит взять (в порядке ценности)

Что уточнилось после разбора