Мы делаем конвейер коротких вертикальных мультиков (Reels, Shorts): 1080×1920, 30 кадров в секунду, 30-60 секунд, воксельный 3D - герои и декорации собраны из кубиков. Видеогенерацию не используем: каждый кадр рисует код на three.js, ролик собирает ffmpeg. Сначала проверь, что у меня стоят Node.js, git и ffmpeg, и покажи версии. Чего нет - объясни, как поставить, и дождись меня. Ничего не ставь через sudo сам. Правила проекта - запиши их в CLAUDE.md и соблюдай: - Работаем в git, после каждого законченного шага - коммит. - Сторонние части - закреплённой версии и лежат в проекте: three.js (конкретная версия), Chrome for Testing (конкретная версия, скачай в папку проекта). Большие файлы (браузер, видео, звук) - в .gitignore. Никаких автообновлений. - Минимум зависимостей: Node.js и его стандартная библиотека. - Данные отдельно от кода: герои, места, сценарии - JSON-файлы в папке series/, движок их только читает. - Ключи и пароли - только в файле .env, который в .gitignore. - Тяжёлое (рендер, тесты с браузером) - один процесс за раз. - Веди docs/STATUS.md: что сделано, какие решения и почему, как запустить. - Не говори «готово», пока не показал результат: кадр, ролик или вывод команды. Потом предложи структуру папок и план из 5-7 шагов. Код пока не пиши.
Как делать такие мультики
Хочешь так же - делай по шагам ниже. Видеогенерации тут нет: сцену из кубиков рисует код, код пишет Claude Code, голос - ElevenLabs, склейка - ffmpeg. На каждом шаге - готовый промт, копируешь и отдаёшь своему Claude Code.
Новые серии - в инсте @eskabez.
Что нужно
Как пользоваться. Открой Claude Code в пустой папке и давай промты по одному, по порядку. После каждого шага требуй показать кадр или ролик. Слова «готово» мало. То, что в [скобках], меняешь на своё.
Для первого ролика хватит шагов 1-11. Маскоты, мат и карточки - потом. За вечер не соберётся. Ключи и пароли в чат не вставляй, пароль от компьютера вводи сам.
1 Старт проекта
Правила, по которым Claude Code будет работать весь проект. Главное - закрепить версию браузера: он рисует кадры, и если обновится, поплывёт картинка.
2 Движок и рендер
Кадр рисуется для заданного момента времени, а не «вживую». Поэтому рендер повторяемый: один и тот же кадр всегда выходит одинаковым. У меня ролик рендерится за 1,2-2,3 минуты на ноутбуке.
Собери движок рендера. 1. Страница на three.js рисует сцену для заданного момента времени t. В рендере нет реального времени и requestAnimationFrame: всё, что двигается (моргание, жесты, камера), - чистая функция от t. Случайности только с зерном (например, от id героя). 2. Рендер: скрипт на Node запускает закреплённый Chrome for Testing без окна (headless, через DevTools Protocol), для каждого кадра ставит t = номер / 30, забирает картинку canvas и отдаёт кадры в ffmpeg. 3. ffmpeg: H.264, yuv420p, CRF 20, preset medium, метки цвета BT.709, звук AAC 48 кГц, громкость -14 LUFS, флаг faststart. Плюс обложка 1080×1440 из выбранного кадра. 4. Режим раскадровки: вместо ролика - по кадру JPEG на каждый план, чтобы я смотрел глазами до полного рендера. Для проверки - пустая сцена с кубом, который вращается 3 секунды. Покажи ролик и замер: сколько секунд рендера уходит на минуту видео.
3 Герой-человек
Людей собирает конструктор из деталей: причёски, очки, худи, кроссовки. Можно по своему фото. У людей 10 жестов и 5 эмоций.
Сделай героя-человека из деталей конструктора. Стиль: коробки со слегка скруглёнными краями, матовые цвета, крупная голова, мило и смешно, читается с телефона. - Каталог деталей: причёски, бороды, очки, головные уборы, верх, низ, обувь, аксессуары; телосложение; рост 0.85-1.15 от обычного. Герой - JSON-файл в series/characters/. - Скелет с суставами. Руки ставятся по цели кисти (двухзвенная IK), локти смотрят наружу. - 10 жестов: none, explain, one (палец вверх), shrug, point, nod, facepalm, thumbs_up, wave, arms_crossed. Жест начинает подниматься чуть раньше реплики. - Лицо: 5 эмоций (neutral, smile, surprised, skeptical, angry). Моргание раз в 2.6-4.8 с, у каждого свой ритм. Рот открывается по громкости своей реплики. - Слушатель поворачивает голову к тому, кто говорил последним. Мой герой: [причёска, борода, очки, одежда, телосложение - или приложи фото]. Подбери самое близкое из каталога, а чего нет - перечисли. Фото не клади в git. Покажи кадры всех жестов и проверь: очки на уровне глаз, борода не внутри головы, волосы не торчат из-под шапки, руки в кадре.
4 Маскот из кубиков можно потом
Зверей и предметы конструктор не умеет. Я попросил собаку и получил человека с именем «собака». Поэтому не-людей лепит ИИ из кубиков по описанию.
Описывай так: кто + главная черта формы + цвет + 1-2 вещи + характер. Например: «Гусь в строительной каске, злой прораб».
Нужен второй вид героев - «вылепленные» не-люди (звери, предметы с лицом, роботы) - и лепка по описанию моделью. Формат: герой - список частей. У части есть роль, точка поворота и родитель, внутри - кубики строкой «x y z ширина высота глубина #цвет» в метрах. Роли: body (одна, корень) · head (кивает, точка - шея) · eye (моргает) · brow (брови) · jaw (челюсть откидывается при речи) или mouth (плоский рот растягивается) - ровно одно из двух · smile (уголки улыбки) · ear · tail (виляет) · arm (жесты, точка - плечо) · leg · wing · segment (волна для гусениц) · static (шапка, очки, сумка). Правила лепки - вставляй их в каждый запрос к модели: - Человек в сериале около 2.1 м. Зверь не ниже 0.8 м и не шире 0.9 м: он стоит рядом с другим героем. - 25-150 кубиков, 3-8 цветов. - Мелкие детали (зрачки, нос, пуговицы) - тонкие пластинки НА поверхности, не утоплены внутрь. - Симметрия точная. Висящих кусков нет: каждый кубик касается другого. - Лицо смотрит в камеру, глаза и рот чёткие. - На миниатюре с первого взгляда должно читаться, кто это: преувеличь главные черты. - Отдельным полем - характер одной фразой. Его прочитает сценарист. Сделай скрипт: описание -> модель лепит JSON -> проверка формата -> если слишком широкий, ужать целиком. Модель зови через claude -p (в рамках моей подписки), а не через отдельный ключ API. И лист: все герои в три четверти одной картинкой. Первые герои: [толстый рыжий кот в свитере с оленями, ленивый], [гусь в строительной каске, злой прораб].
5 Места
Два шаблона: крыша над городом и комната-декорация без передней стены. Смешной декорацию делают надписи: «Дедлайн вчера», график выручки, который только падает.
Сделай шаблоны мест. Место - JSON-файл в series/scenes/: шаблон плюс параметры. 1. Крыша небоскрёба над городом: день, закат или ночь, плотность города, лавка. Город - кубы с окнами, ночью часть окон светится. 2. Комната-декорация, как в театре: пол, задняя и боковые стены, потолок, передней стены нет. Виды: офис, кухня, кафе, серверная, лифт. - Потолок 5-6 м: при 3.4 м он лез в верх кадра. - Стены односторонние: камера снаружи видит сквозь них. - Надписи-гэги на доске, постере и экране, до 40 символов: доска «[Задача: поменять 1 кнопку]», постер «[Дедлайн вчера]». - Реквизит, чтобы было обжито. Офис: полка с папками, стикеры, телевизор с падающим графиком выручки, неон, пицца, кофе, кресло-мешок. - Места для героев: двое по центру; для четверых - ещё двое по краям, на шаг назад, дугой. - Главный свет спереди сверху слева. Покажи по кадру каждого вида с двумя героями.
6 Камера
Восемь планов, план меняется почти на каждой реплике. Камера ставится по точкам героя, поэтому один код снимает и человека, и кита.
Сделай решатель планов камеры. На вход: тип плана, говорящий, слушатель, все герои, время. Камера ставится по точкам героя (макушка, центр головы, грудь, таз), а не по жёстким координатам. Кадр 9:16. Верхние 26% кадра - полоса титров: лица туда не заходят. Планы: - wide: все целиком; если героев четверо, камера отъезжает, пока все головы не влезут. - medium: говорящий по центру, таз на ~78% высоты, чтобы поднятая рука влезала. - close: голова целиком до подбородка и запас на челюсть - она опускается, когда герой говорит. - over_shoulder: камера перед говорящим, повёрнута на ~35° к слушателю, плечо слушателя у края кадра. - two_shot: говорящий и тот, к кому он обращается. - high: пара сверху, камера медленно идёт дугой. - low: говорящий снизу - комичный «геройский» ракурс. Объектив не ниже 15 см над полом. - three_quarter: оба сбоку под ~40°, на разной глубине. Правила: - За время плана камера медленно наезжает. - Если кто-то стоит на линии взгляда, камера облетает на 20°, 35°, 50°. - Если голова героя больше половины кадра, кадр расширяется. - Все планы с запасом: лучше на 15-20% свободнее, чем тесно. Сделай раскадровку: кадр на каждый план с двумя и с четырьмя героями.
Проверь глазами:голова целиком. Корги срезало пасть, потому что кадр строился по груди, как у человека.
7 Библия канала
Короткий файл, который сценарист читает перед каждым выпуском: о чём канал, кто герои, как шутим. Без него сценарии выходят никакими.
Помоги написать библию моего канала - файл, который сценарист читает перед каждым выпуском. Задавай мне вопросы по одному, потом собери series/bible.md: - о чём канал и кто зритель; - герои: как выглядят, характер одной фразой, как говорят (кто-то умничает, кто-то приземляет вопросами зрителя); - тон юмора: над чем шутим и чего не делаем никогда; - мат: можно или нет (если можно - только запиканный); - формат: длина, темп, чем заканчивается выпуск, какой призыв в конце; - 2-3 реплики, которые мне самому кажутся смешными.
8 Сценарий
Смешным ролик делает текст. Формула:
- Первая реплика - крючок, досматривают из-за неё.
- Реплика на 1-2 секунды.
- Цифры - как гэг, и словами, чтобы синтезатор не споткнулся.
- Каждая реплика абсурднее предыдущей.
- Скептик задаёт вопросы, которые задал бы зритель.
- В конце призыв и добивка другого героя.
Так это выглядит в «Одной кнопке» (39 секунд, 22 реплики):
яКлод, поменяй одну кнопку.
КлодЯ нашёл ещё двенадцать проблем.
яЧетыреста двенадцать файлов?!
КлодИ кнопку. Она теперь синяя.
яОна была синяя.
КлодТеперь она правильно синяя.
Крючок, эскалация цифрами, абсурд на пике. Жёлтым - одно слово в реплике.
Ты сценарист коротких вертикальных мультиков. Прочитай series/bible.md, героев и места из series/. Тема: [одна мысль, например: «попросил ИИ поменять одну кнопку, а он переписал весь проект»]. Герои: [кто слева, кто справа]. Место: [какое]. Как писать: - Около [40] секунд - это примерно 500 символов речи. - Первая реплика - крючок: зритель должен захотеть досмотреть за 2 секунды. - Реплика на 1-2 секунды, разговорно, без ремарок и эмодзи. - Цифры - как гэг, и словами, как произносят («четыреста двенадцать»). - Каждая реплика чуть абсурднее предыдущей. Скептик задаёт вопросы зрителя. - Концовка: [мой призыв] и короткая добивка другого героя. - В реплике можно выделить *одно* слово звёздочками - в титрах оно станет жёлтым. Не в каждой. Сохрани в series/episodes/[номер-название]/script.json: место, герои со своими местами и реплики. У реплики: speaker, shot, gesture, emotion и chunks - текст кусками до 34 символов (кусок = строка титров). Планы, жесты и эмоции - только те, что уже умеет движок; крупный - для панчлайна.
9 Голос
ElevenLabs, у каждого героя свой голос, темп 1,2 - так живее. Бесплатную Qwen3-TTS я тоже пробовал: вслепую выбрал ElevenLabs 4 раза из 4. Оговорка: он все четыре раза стоял под буквой B.
Подключи озвучку ElevenLabs. Ключ читай из .env. - Каждая реплика - отдельный запрос text-to-speech, готовая лежит в кэше по хэшу запроса (голос, модель, текст, темп). Без кэша каждый перерендер снова платный и сдвигает тайминг. - Модель eleven_v3. Её параметр скорости не работает, поэтому темп ([1.2]) делай после синтеза через ffmpeg atempo, потом звук в 48 кГц. - Голоса - из стандартных голосов ElevenLabs: они работают и на бесплатном тарифе. - Выбор голоса вслепую: одна фраза 3-4 голосами, порядок случайный, подпиши A, B, C, раскрой после моего выбора. - Числа - словами, ремарок в тексте нет. - Таймлайн: 0.5 с тишины в начале, 0.3 с между репликами, 1.4 с в конце. По нему двигаются рот, жесты, камера и титры. - Черновой режим - системный голос (say на маке), файл помечай -draft. - Проверка: прогони дорожку через распознавание речи (ElevenLabs Speech-to-Text или whisper) и сравни с текстом слово в слово. Синтезатор иногда глотает слова. Покажи таблицу «реплика - распознано - совпало».
10 Титры
Крупные, заглавными, сверху. Внизу они закрывали рты на крупных планах.
Сделай титры в формате ASS и вжигай их в видео через ffmpeg (libass). - Сверху по центру, 300 px от верхнего края. - Узкий жирный шрифт ЗАГЛАВНЫМИ, 108 px, белый, чёрная обводка 7 px, тень 4 px. Файл шрифта - в проекте, иначе ffmpeg молча подставит другой. - У каждого героя свой светлый цвет. Слово в *звёздочках* - жёлтое (#ffd34d), сами звёздочки не рисуются и не читаются голосом. - Реплика режется на куски до 34 символов, время делится по длине кусков. - Каждый кусок «выпрыгивает»: 92% размера на 90 мс, потом 100%. Покажи кадр с самой длинной репликой и кадр с жёлтым словом.
11 Собрать выпуск
Одна команда: папка выпуска на входе, готовый mp4 на выходе. После этого шага у тебя первый ролик.
Собери всё в одну команду: папка выпуска -> final.mp4 и обложка. 1. Проверка сценария: герои и место существуют, планы, жесты и эмоции - из тех, что умеет движок, куски не длиннее 34 символов. Ошибка - понятным текстом, до озвучки. 2. Голос по репликам (через кэш) и таймлайн. 3. Раскадровка - кадр на план, чтобы я посмотрел до полного рендера. 4. Рендер, титры, звук -14 LUFS, final.mp4 и обложка. 5. Рядом - замер: секунды рендера на минуту видео и какие голоса были черновыми. Сделай тестовый выпуск на 4 реплики с моими героями на крыше: сначала покажи раскадровку, потом ролик.
12 Запикать мат можно потом
Мат можно, но один-два раза за ролик и всегда запиканный: в звуке писк, в титрах звёздочка. «Всё х∗йня, давай по новой!»
В выпуске есть мат, его надо запикать. 1. Прогони дорожку через распознавание речи с метками слов и найди время каждого матерного слова. 2. На интервале слова с небольшим запасом голос глуши в ноль, под ним - писк: синус 1000 Гц, громкость 0.3. Исходную дорожку сохрани рядом. 3. В титрах замени одну букву звёздочкой (х∗йня). 4. Встрой это в команду выпуска сразу после озвучки, чтобы любая переозвучка повторяла шаг.
13 Карточки поверх видео можно потом
Коммит, поиск, пулл-реквест - маленькая HTML-карточка всплывает на время реплики, со щелчком. Мелочь, а глаз цепляется.
Сделай карточку-вставку поверх ролика. - Карточка - HTML/CSS 820 px шириной: [например: «Клод · коммит», «Поменял одну кнопку», «412 файлов +18 204 −17 999»]. Тёмная, скруглённая, крупный шрифт. - Сними её в PNG с прозрачным фоном тем же Chrome без окна. - Наложи через ffmpeg overlay на время реплики №[номер] - время возьми из таймлайна. Появление и исчезание по 0.12 с, нижняя половина кадра, не на лице и не на титрах. - В момент появления - щелчок: синус 880 Гц с быстрым затуханием, 0.2 с. Сделай это скриптом: ролик, папка с карточками и номера реплик - на входе.
14 Проверка
Главные ошибки ловятся глазами на раскадровке, а не тестами. У меня больше 350 автотестов, и всё равно так.
Сделай раскадровку выпуска [папка]: кадр на каждую реплику, с титрами, одной сеткой. Проверь каждый кадр и дай таблицу «кадр - что не так»: титры на рту, срезанная голова или челюсть, потолок в кадре, кто-то заслоняет говорящего, руки за краем, надписи декораций под титрами. Ничего не исправляй, пока я не посмотрю.
Где споткнёшься
- Титры на рту - поднять наверх.
- Потолок в кадре - потолки 5-6 метров, в кадре не заметно.
- Тесно - все планы на 15-20% свободнее.
- Герой заслоняет героя - ставить дугой, камера облетает.
- ИИ сдаёт работу, которая проходит тесты, но не делает дела. У меня так было в 4 задачах из 9. Лечится только просмотром рендера.