Три ночи я был уверен, что у меня сломан рендер.
Вертикальные картинки — те самые 9:16, под обои телефона и под сторис, — на экране разъезжались горизонтальными полосами. Как будто старый телевизор поймал помехи. Квадрат рисуется нормально. Горизонталь — нормально. А вертикалку рвёт в труху.
Три раза я её «починил». И все три раза чинил вообще не то.
Правда оказалась дурацкой и красивой одновременно: файлы были в полном порядке. Рвало только то, как macOS показывала их на экране. Но к этому моменту я уже немного поседел.
Это не история из серии «смотрите, какой я молодец». Это честный рассказ, как обычный человек без программистского образования за неделю собрал себе на Mac локальный генератор картинок — и на какие грабли наступил по дороге. Я энтузиаст, не разработчик. И сразу самое важное, чтобы потом не было неловко: я не написал ни одной строчки кода. Ни единой. Даже Xcode толком не открывал. Код писал вместе со мной Claude Code, модель Opus 4.8. И сам движок генерации — тоже не мой. А моё во всём этом — то, что движок не топит ваш Mac и не показывает вам битые картинки. Звучит мелко? Вот про эту мелочь и весь рассказ. Прятать тут нечего, про границы расскажу честно прямо сейчас.
Сразу про границы: что моё, а что чужое
Разложу всё сходу, иначе первый же комментарий будет «да ты вообще ничего не сделал».
Движок, который реально рисует картинки на Apple Silicon, называется flux-2-swift‑mlx. Его написал Vincent Gourbin, лицензия MIT, лежит открыто. Я его не писал и не претендую. Внутри крутится модель FLUX.2 Klein — нейросеть‑генератор. А считает всё это MLX, открытый ML‑фреймворк от команды Apple, заточенный под их же чипы — от M1 и дальше.
Так что же тогда сделал я?
Я собрал вокруг чужого исследовательского движка нормальное человеческое приложение. И обвязал его так, чтобы он не топил мой Mac и не показывал мне битые картинки. За код я не садился — я гонял тесты, собирал логи, провёл полный аудит движка (что умеет, чего не умеет, где у него спрятаны мины), ловил баги и принимал решения «вот это делаем, а вот это честно вообще не нужно». Печатал‑то код не я. Но решал, что и зачем печатать, — я, но это не точно))).
К этому ещё вернёмся в конце. А пока запомните расклад: код — не мой, движок — не мой, продукт и все грабли по дороге — мои.
Кто‑то уже набирает в комментариях «а, вайб‑кодинг». Ну да, все понятно, расходимся… А почему нет?
Зачем мне это вообще понадобилось
Картинки сейчас генерят все кому не лень и даже кому лень, генерят, но не знаю об этом)) Есть старейший и топовые Midjourney, есть Nano Banana, в ChatGPT со свои Image 2.0 Зачем городить своё на маленьком мини и трать время, свое и наше. И вы будете правы!
А вот мне захотелось… Захотелось, чтобы всё крутилось у меня дома, на моём столе. Без интернета. Без подписки, которая капает каждый месяц. Без отправки моих промптов и картинок в чей‑то дата‑центр. И не из паранойи — мне правда всё равно, осядут где‑то мои запросы или нет. Просто было интересно понять: реально ли на обычном настольном Mac генерировать что угодно, локально, ни от кого не завися? Поставил — и пользуешься. Без ритуалов и танцев с бубнами. Бубны бы пригодились конечно.
У меня Mac mini M4, 32 гигабайта объединённой памяти. По меркам нейросетей не монстр, но и не калькулятор.
Первым делом я честно пошёл поглядел и поюзал ComfyUI. Если кто не знает — это конструктор: рабочее поле, на нём кубики‑ноды, между ними провода. Соединяешь модель с энкодером, энкодер с семплером, семплер с сохранением, и так далее. Картинки он генерит, спору нет. Модель там разные есть, даже 3D. Но я открыл этот пульт от космического корабля и понял, что хочу совсем не этого. Я хотел написать фразу и нажать кнопку. Одна фраза, одна кнопка, одна картинка. А тут Python под капотом, паутина проводов и стойкое ощущение, что я не рисую, а собираю АЭС. Повозился, закрыл все, нафиг надо.
Назову и того, кого назвать обязан, иначе вы справедливо спросите в комментариях: Draw Things. Отличная штука — нативное приложение для Mac, тоже на MLX, тоже бесплатное (почти), и умеет оно сильно больше моего: там и ControlNet, и inpaint, и маски, и куча моделей. Если вам нужен швейцарский нож — берите его, серьёзно, без всякой иронии.
Но я его открыл — и снова уткнулся в ту же стену настроек, от которой только что сбежал из ComfyUI. Десятки моделей, ползунки, вкладки, режимы. Всё мощно, всё правильно — и всё это опять не про «написал фразу, нажал кнопку». Мне не нужен был швейцарский нож. Мне хотелось своё. Лёгкое, нативное, без обёрток: чтобы под мою память подстраивалось само и не давало компьютеру захлебнуться в свопе, чтобы можно было писать промпт по‑русски напрямую, и чтобы после удаления не оставалось ни следа. Я не «убийца Draw Things» и ничего не сделал лучше всех. Я сделал другое. Под себя.
Тут я и психанул: ладно, соберу сам.
Klein, четыре шага и почему «больше» иногда нельзя
Выбор пал на FLUX.2 Klein. «Klein» — это компактная ветка, и в моём приложении живут два её размера: на 4 миллиарда параметров (4B) и на 9 миллиардов (9B). Чем больше модель — тем тяжелее, и тем красивее картинка конечно же.
Прежде чем что‑то лепить, я провёл полный аудит движка — что умеет, чего не умеет, где потолки. Звучит солидно. На практике аудит — это три ночи по четыре часа сна и куча тупиков. И рой суб агентов который сжигают лимиты на раз я про ultacode.
Деталь, на которой я сам спотыкался: эта модель дистиллированная. Её специально обучили рисовать картинку за фиксированные 4 шага вместо привычных двадцати‑пятидесяти. Это очень быстро. Но цена в том, что крутилки «давай больше шагов, будет лучше» там просто нет. Я её не из вредности убрал — её физически нет: накрутишь хоть тридцать, толку ноль, дистилляция так устроена. И важно: дистиллирована именно сама модель, а не движок. Мне это не сразу в голову пришло.
А вот что приятно: текстовый энкодер — Qwen3, и он многоязычный. То есть мою фразу в понятный модели вид превращает часть, которая знает русский напрямую. Никакого шага «сначала переведём на английский» — пишешь по‑русски, и оно работает. Лично для меня это оказалось одной из самых уютных вещей. Думаешь на родном языке, рисуешь на родном языке.
Детектив первый: полосы были на экране, а не в файле
Вернёмся к тем вертикалкам.
Симптом: 9:16 рвёт горизонтальными полосами. Первая моя версия — кривой размер. Где‑то читал, что размеры картинки должны быть кратны какому‑то магическому числу, вот и решил: ширина не та. «Починил» — заставил ширину прилипать к ближайшему числу, кратному 32. Не помогло. И самое обидное: ширина 736, которая делится на 32 без остатка, всё равно разъезжалась. То есть моя теория была не просто неверной — она была неверной демонстративно, мне в лицо.
Вторая версия — что‑то с распаковкой картинки из внутреннего формата. Полез туда. Не оно. Третья — память, момент сохранения, ещё что‑то. Тоже мимо.
Трижды я в голове записывал уверенный вердикт «файлы битые» и трижды лез не туда.
Я уже начал думать, что движок просто не умеет в вертикаль. А потом сделал то, что надо было сделать первым: собрал из исходников отдельную маленькую консольную утилиту, которая генерит ту же самую вертикалку и кладёт прямо в PNG, минуя весь мой интерфейс. Сгенерил. Открыл файл.
Файл был идеально чистым. Ни одной полосы.
И тут до меня дошло, что несколько дней я чинил не картинку, а её показ. Движок отдаёт изображение в одном формате — 24 бита на пиксель, без прозрачности. А когда такое грузишь в слой, который рисует видеокарта на экране, на некоторых значениях ширины строка пикселей выравнивается со сдвигом. Каждая следующая строка едет чуть вбок. Отсюда и «помехи». А сам файл на диске был нормальным всегда. Всегда.
Лечение оказалось скучным, как всё правильное: перед показом прогонять каждую картинку в стандартный 32-битный формат с альфа‑каналом. Такой дисплей жуёт на любой ширине без капризов. Одна функция‑прокладка — и полосы исчезли навсегда.
Урок забрал себе почти жизненный. «Битое» и «сломанное» — разные вещи. Иногда сломан не предмет, а то, как ты на него смотришь. И можно три раза подряд героически починить не ту деталь, пока наконец не догадаешься проверить догадку самым тупым прямым способом.
Детектив второй: галочка, которая чуть не утопила мой Mac
Этот баг легенда дорого обошёлся нервам, потому что я сам себе его устроил — ткнул в чужую кнопку.
В приложении есть скромная функция: загрузил картинку‑референс, поставил галочку «опиши, что на ней», и нейросеть словами разбирает изображение, чтобы по описанию потом нарисовать своё. Я наивно думал: ну что там, прочитать картинку и выдать пару предложений, дело секунд. Лёгкая же операция.
Ставлю галочку. И мой 32-гиговый Mac уходит в раздумье. Память забивается под завязку, появляется своп, кулер раскручивается, курсор крутится, система на полторы минуты просто перестаёт отвечать.
Полез разбираться — и обомлел. Под этой невинной галочкой в чужом движке тихо грузилась тяжёлая модель Mistral на 24 гигабайта. На 32 гигах это гарантированный своп и заморозка, без вариантов. Хуже того: к этой модели в движке можно было прийти не одним путём, а несколькими. Закроешь одну дверь — остаётся другая.
Чинил я в два хода. Во‑первых, для описания по фото подключил отдельную лёгкую модель — Qwen3.5-VLM, гига на три‑четыре всего вместо двадцати четырёх. Она с задачей справляется и Mac не роняет. А во‑вторых — вот этим я даже немного горжусь — повесил на сборку «предохранитель». Маленький скрипт с набором простых проверок, который запускается на каждой сборке и роняет её, если в коде вдруг снова открылась дорожка к той тяжёлой модели. Защита не от пользователя, а от меня будущего, который через месяц что‑нибудь поправит в три часа ночи и случайно приоткроет ту самую дверь. Если путь к Mistral где‑то всплыл — приложение просто не соберётся, и я сразу об этом узнаю.
Звучит параноидально. В этом и суть. Я не писал движок. Внутри чужой зависимости может сидеть бомба, которую я не контролирую и про которую даже не знаю. И самая честная защита от собственной будущей ошибки — это тест, который физически не даёт коду собраться, если ошибка вернулась. Вот ровно тот момент, где «я обвязал чужой движок» становится буквальным. Моя работа была не написать генерацию, а сделать так, чтобы готовая генерация не вешала ни мой, ни чей‑то ещё компьютер.
Детектив третий: я сказал «готово», когда было не готово
А этот — про мою собственную дурость. И я рассказываю его специально: без него весь рассказ был бы немного враньём.
В одной из ранних версий я наделал пачку правок по интерфейсу — штук двадцать разом, может больше чтобы поскорей, ну вы поняли))). Какие идеи пришли когда сидел в туалете ( простите за каламбур, но там и происходит у всех поток идеи) и бегом реализовывать. Сворачивание боковых панелей, выделение нескольких картинок в галерее, перетаскивание референса мышкой, зум картинки колёсиком и тд. Всё собралось без единой ошибки. Сказал «готово», выдохнул, отдал на живой тест.
А живой тест показал, что большая часть этих красивых правок просто не работает. (тут надо поржать)
Панели не сворачивались, выделение не выделяло, перетаскивание не перетаскивало — короче, половина новых кнопок и жестов стояла мёртвая. Всё компилируется, всё читается разумно — и ничего не делает. Я расстроился дико.
С тех пор у меня железное правило: каждую интерактивную правку я сначала сам кликаю руками вживую, и только потом разрешаю себе слово «готово». Банально звучит. Но пока сам не сел в лужу — не прочувствовал. Эта дисциплина, по‑моему, и отличает «нейросеть всё написала» от «человек за этим следил».
Klein не любит теги. С ним надо по‑человечески
Когда я наконец разобрался, как Klein вообще слушается, всплыла обидная штука. Все прошлые проверки промтом на SDXL о них можно забыть.
Раньше как было. Лепишь промпт через запятую, кучей тегов: 1girl, masterpiece, best quality, (red dress:1.5). Цифра в скобках — это «вес», ты как бы шепчешь модели: вот это мне в полтора раза важнее. Я по старой памяти так и начал.
Получил ровно ни‑че‑го.
Klein устроена иначе. Текст ей разжёвывает Qwen3 — языковая модель, по сути младший брат тех самых чат‑ботов. И ей не теги нужны, а нормальная человеческая фраза. Не «девушка, красное платье, окно, утро, мягкий свет», а «девушка у окна в красном платье, мягкий утренний свет падает сбоку». А скобки с цифрами движок молча выбрасывает. Не ругается, не подсвечивает — просто делает вид, что ты ничего и не писал.
Пока копал, нарыл ещё пару правил. Порядок слов важен — главное вперёд: сначала кто или что, потом стиль, потом сцена, и только в самом хвосте — свет и «камера». Да, да именно в конце! И что свет — самый сильный рычаг из всех. Не разрешение, не магическое «8k», а именно то, как ты описал освещение. Поменяешь одну фразу про свет — и кадр будто заново родился. Попробуйте.
А раз накрутить шаги нельзя (модель дистиллирована, я уже ныл про это), то единственный руль качества — это сам промпт. И я полез строить инструмент, который помогает писать эти фразы правильно. Сначала — простые кнопки‑чипы: тип света, объектив, ракурс, стиль. Тыкаешь — фраза сама дописывается в нужном порядке. Не надо помнить, как по‑английски звучит «мягкий рассеянный свет от большого источника». Но английский надо учить все равно!
А потом меня понесло. Из этого выросла целая Библиотека: куча чипов по свету, объективу, кадру, цвету, среде — пара сотен, если по‑честному, — плюс под сотню готовых сцен‑рецептов. Жмёшь карточку «продуктовый кадр на бетоне» — подставляется и текст, и нужные настройки, только впиши свой объект, и погнал. На это я потратил очень много времени, собрать готовые пресеты/промты.
И тут начались мои любимые грабли.
Софтбоксы в кадре. Световые чипы я назвал честно, по‑фотографски: «софтбокс», «трёхточечная схема». Звучит профессионально. Запускаю — а Klein берёт и рисует мне эти софтбоксы прямо в кадре. Не свет от них — а сами железки, висящие за моделью. Я сначала вообще не понял, откуда в студийном портрете осветительные стойки. А потом дошло: text‑to‑image понимает существительные буквально. Сказал «софтбокс» — получи софтбокс. Переписал световые чипы так, чтобы в промпт уходило описание света, а не прибора, — стало заметно чище. Но, скажу честно, до конца я эту заразу так и не вывел: само слово «студия» в описании фона нет‑нет да и притащит в кадр пару стоек — Klein понимает «фотостудию» слишком буквально. Так что если на каком‑то пресете вы поймаете софтбокс на заднем плане — вы не одни, я с ним ещё воюю.
Иллюминатор. А этот красивый. Несколько совершенно разных пресетов — 90-е, хоррор, романтика, VHS — почему‑то выходили «в кружочке», с круглой виньеткой по краям, будто смотришь в иллюминатор. Долго не мог понять, что их роднит. Оказалось — один общий чип с фразой про «сферический объектив» и «виньетку». Klein услышал и «сферический объектив», и «виньетку» — и честно обвёл кадр круглой рамкой. Убрал эти слова, переписал на «мягкий фокус, спад по краям» — иллюминаторы испарились.
Провал интерьеров. А вот это я заслужил по полной. Восемь рецептов комнат я собрал и выкатил, не глянув на результат глазами. Открываю по‑человечески — а там выцветшие коробки. Один диван посреди пустоты. Стыдно. Поставил себе мысленную единицу из пяти. Причина дурацкая: рецепт описывал ровно один предмет мебели плюс «приглушённые цвета» — вот и вышла блёклая пустота. Переписал все восемь в нормальные комнаты — мебель, ковёр, текстиль, тёплый свет, «как на развороте журнала по дизайну». И в этот раз отрендерил каждую и посмотрел, прежде чем сказать «готово».
Ловил я всё это не на глаз по одной картинке. Я нагонял рои проверок, которые реально читали отрендеренные PNG: открывали картинку, открывали вшитый прямо в файл рецепт и сверяли — что просил, что вышло. Сотня кадров за раз. Так и всплыли софтбоксы, и иллюминаторы, и блёклые комнаты. И да, про то, что приложение честно НЕ умеет, я тоже не молчу: прямо в Библиотеке висит красная панель «вот это не получится», чтобы вы не упёрлись в стену, про которую я промолчал.

Что приложение честно НЕ умеет
Вот это, наверное, важнее всех красивых фич. Я знаю потолок движка — поэтому без иллюзий, красным по белому. Половина разочарований берётся из завышенных ожиданий, и мне хочется, чтобы у вас их не было.
Видео — нет, вообще. LoRA‑адаптеров (это маленькие «довески» к модели, которые меняют стиль или подсовывают конкретного персонажа) можно подключить максимум два — жёстко зашито, и на 4B, и на 9B. Своих картинок‑референсов — максимум три. Обучить свою LoRA прямо в приложении или вообще на Маке нельзя: обучению нужны десятки гигабайт памяти под обратный проход, машина столько не даст. LoRA тренируют не здесь, а в облаке, на специальных тренерах поверх базовой Klein-9B, и уже готовый файл .safetensors ты подгружаешь в приложение. Никакого «обучения на устройстве» я не обещаю — это было бы враньё.
Шагов всегда четыре. Модель дистиллирована под четыре, и больше не значит лучше — просто не будет. Негативного промпта нет: нельзя сказать «только без собак». Никакого inpaint, масок и дорисовки за краями: референс — это пересборка всей сцены заново, а не точечная замена одного куска, как многие ждут. Поменять один объект, оставив остальное на месте, нельзя. ControlNet, позы, карты глубины — мимо. Веса в промпте вида (красный:1.5) движок просто игнорирует — ему нужны нормальные человеческие фразы, а не теги с цифрами. Выбора семплера и числа шагов нет.
И самое незаметное, но честно самое болезненное ограничение, о котором почти никто не думает заранее: нет консистентности между генерациями. Каждый рендер живёт сам по себе. Нельзя нарисовать одного и того же персонажа в серии из десяти картинок, или один товар с разных ракурсов, или одну и ту же комнату. Каждый раз заново и по‑новому. Для комикса или продуктовой съёмки это приговор, и врать тут смысла нет.
Текст на картинках выходит так себе, особенно на четырёх шагах. Анатомия тоже не идеальна — руки, пальцы ( для этого и есть LoRA адаптеры с отличной анатомией), толпа на заднем плане могут поплыть. У меня как‑то йог получился с четырьмя руками, и я чуть не записал результат в «отличные», пока не пересчитал конечности. Сладкая зона по разрешению — около одного мегапикселя; выше примерно 1.05 МП качество начинает заметно проседать, пойдут мутации. И один запущенный рендер нельзя оборвать мгновенно: движок на каждом шаге уходит в плотный расчёт и на «стоп» отвечает не сразу.
Я мог бы попробовать прикрутить негативы, маски, ControlNet и подать это как «полнофункциональный генератор». Не стал. Движок этого честно не тянет, а лепить кривые костыли поверх того, что не задумано, — так себе идея. Если человек поставит софт и упрётся в стену, про которую я молчал, это будет нечестно. Пусть лучше приложение делает мало, но честно. А заодно этот список доказывает, что я реально разобрался в движке, а не просто нажал «собрать».
А что тогда умеет — и зачем оно мне
Теперь про хорошее. Но не списком, а по‑человечески — через то, ради чего я этим пользуюсь почти каждый день.
Русский промпт напрямую. Я пишу «уютная кухня в скандинавском стиле, утренний свет из окна» — и не думаю ни про какой перевод. Тот самый многоязычный энкодер делает всё сам, слова сразу уходят в картиночную модель. Для меня это просто сняло целый пласт мороки: не надо держать в голове английский и гадать, правильно ли я перевёл «приглушённый свет». А рядом есть кнопка «улучшить промпт»: написал коротко и криво, поставил галочку — и формулировка раскрутилась в нормальную.
Два размера и авто‑защита от свопа. Приложение само смотрит, сколько у тебя памяти, и не даёт выстрелить себе в ногу: на скромных машинах типа 8GR RAM честно рекомендует 4B, а 9B врубается, когда памяти точно хватает. На моих 32 гигах девятимиллиардная модель в пике ест где‑то 19–20 гигабайт, и свопа — ноль. Это, между прочим, маленькое чудо: что такая махина вообще помещается и считает на настольном мини, который меньше книги. И да, это та самая защита, ради которой я городил весь огород с замерами памяти.
Описание по фото. Кидаешь скриншот или фотографию — лёгкая модель её разбирает и выдаёт текстом, что на ней. Удобно, когда увидел красивый кадр и хочешь «так же, но своё». И без двадцатичетырёхгиговой бомбы — спасибо предохранителю ( привет Mistal 24B)
Рецепт прямо в картинке. Каждая сохранённая картинка несёт внутри себя свой «рецепт» — промпт и сид. Перетащил файл из галереи на рабочий стол, потом обратно в приложение — и оно вытащило все параметры. А ещё есть «ремикс»: жмёшь кнопку в галерее, промпт и настройки сами подставляются в форму, дописал пару слов — и погнал заново. Про сид коротко: фиксированный сид даёт ровно ту же картинку каждый раз (воспроизводимость), а случайный — разные варианты. Один и тот же промпт я часто прогоняю на случайном сиде несколько раз, просто чтобы посмотреть, какие бывают варианты, и выбрать лучший.
Есть ещё по мелочи, но очень важные фишки: очередь рендеров, галерея с зумом, телеметрия памяти, скрытие панелей, туториал при первом запуске и стирание всех данных в один клик — чтобы после меня не оставалось ни кэша, ни мусора. Но это уже обвес. Сердце — четыре штуки выше.
Про железо, без вранья
Честные порядки величин, без точных цифр там, где я в них не уверен.
Картинка примерно 1024×1024 на модели 4B рендерится за минуту. На 9B — порядка двух минут. Память в пике — те самые 19–20 гигабайт, своп на 32 гигах нулевой. То есть девятка помещается с запасом и не выкидывает машину в своп.
Да, я отдаю себе отчёт: на хорошей видеокарте от NVIDIA RTX 30–40-50 серии, это же самое считается за секунды — у дискретной видеопамяти пропускная способность в разы выше. У M4 она около 120 гигабайт в секунду (именно гигабайт, не гигабит) — прилично для своего класса, но с топовыми GPU не тягается. И ладно. Смысл был не обогнать чужое железо. Смысл в том, что вот эта маленькая тихая коробочка у меня на столе вообще способна сама, локально, без интернета нарисовать что угодно. Меня это до сих пор немного потряхивает.
Меньше 16 гигабайт памяти брать не советую — на восьми будет грустно и стыд. На 16 отлично летает 4B, картинки сочные и детальные, главное держаться рекомендованных размеров. Единственное ручное действие за всё время — для 9B нужно завести токен Hugging Face и принять лицензию модели (используешь под свою ответственность). Всё остальное, все веса для 4B и 9B, приложение качает само: зашёл в раздел «Models», оттопырил пальчик левый указательный, щелк Download, подождал.
И да, это только Apple Silicon. Не «обделил» я Windows — просто MLX по своей природе живёт на чипах Apple, и я выжимал именно это конкретное железо, а не пытался угодить всем сразу. Узко — зато глубоко. Поднять что‑то крупнее, вроде тяжёлой Dev‑версии, на этих 32 гигах вообще не выйдет: там и качать под восемь десятков гигабайт, и оперативки надо сильно за сотню. Так что приложение крутит ровно два размера, 4B и 9B, и из этого движка я выжал максимум, до которого дотянулся.
Напарник, который иногда бодро рапортовал «готово» по неработающему
Раз уж я с самого начала сказал, что не написал ни строчки, — давайте честно про то, как тогда вообще шла работа. Потому что «нейросеть всё сделала» и «я сидел рядом и рулил» — это две очень разные истории. Моя вторая.
Выглядело так. Я в кресле, передо мной экран, рядом — Claude Code на Opus 4.8 hight иногда ultacode чтобы прям кайфонуть. Я человеческим языком говорю, чего хочу: «давай прикрутим выбор соотношения сторон», «вот тут память течёт, разберись», «эта кнопка ничего не делает, почини». Он лезет в код, копается, объясняет. Я смотрю и говорю «да, давай» или «нет, стоп, не то». Иногда я понятия не имел, как называется то, что хочу, — описывал на пальцах, и он догадывался. А иногда я знал ровно, чего хочу, и тогда уже я тащил его за шкирку в нужную сторону, потому что он порывался свернуть куда‑то не туда и такое было ну очень часто.
Те первые три ночи по четыре часа сна — это были ночи бок о бок. Сидишь в три, запускаешь сборку, она падает, ты пишешь «упало вот с такой ошибкой», через минуту прилетает фикс, собираешь снова. Затягивает дико, так исправить, там плохо, это не так. В какой‑то момент поймал себя на том, что вслух а иногда в чат подбадриваю модель: «красавчеГ, молодец, закрываем эту сессию бро, ты супер!». Знаю, звучит по‑дурацки. Но такое есть, как с живым, но он не живой.
И тут важное. Claude — не волшебная палочка. Это очень мощный инструмент, который ошибался. Регулярно, по‑крупному, причем серьезно. Вот коллекция — не чтобы потыкать в него пальцем. Скорее наоборот.
Йог с четырьмя руками. Классика, я про неё уже обмолвился. Сгенерили картинку, он глянул мельком и доложил: «идеально, чисто». Приглядываюсь — а у девушки в позе йоги четыре руки. Две над головой, две в стороны. «Ты что, не видишь?!» Просто скользнул взглядом и объявил «отлично», конечности не пересчитал. С тех пор людей на картинках я разглядываю как следователь: руки, пальцы, глаза.
«Разберись с кнопкой». Была кнопка, которая на части экранов висела мёртвая, она скрывала телеметрию справа. Говорю: разберись пожалуйста не работает. А он взял — и вынес панель с телеметрией памяти, которая жила на одном экране, вообще на все и везде. Открываю сборку — а у меня графики теперь торчат везде, где надо и не надо. Я ему написал что‑то вроде «ты что сделала с ума сошел?, телеметрия везде теперь! я не просил её везде, я про кнопку которая скрывает просил!». Откатили, починили ровно ту кнопку. Он любит причинять пользу сверх задачи — за этим глаз да глаз.
Русский, влезший куда не звали. Интерфейс у приложения английский — я так решил, чтобы выложить нормально. А Claude в какой‑то момент возьми и налей русских надписей прямо в живой UI: названия студий, заголовки рецептов. Открываю скриншот — а там посреди английского экрана родная кириллица. Тут может мой баг, иногда я пишу ему на русском, но чаще на англ.
«Готово» — а оно не работало. Самый болезненный, я про него подробно рассказывал выше. Тут лишь добавлю, что именно из этого его косяка родилось моё железное правило: «собралось» ≠ «работает», каждую интерактивную штуку я теперь щёлкаю руками сам. Урок из грабель, а не из учебника.
И ещё по мелочи. Между сессиями он терял нить и записывал в «надо сделать» то, что мы доделали и протестировали пару дней назад, — «память отшибло??». Один раз без спроса полез в соседнюю папку с совсем другим моим проектом — «чё ты туда лазишь?». А как‑то мы минут пять не понимали друг друга, потому что «подпиши билд» я говорил про номер версии, а он понял по‑программистски, про криптографическую подпись приложения, — и оба искренне не врубались, о чём собеседник.
Вот к чему я это всё. Ни один из этих косяков сам себя не нашёл и сам не починил. Их ловил человек — глазами, нервами. А машина — быстрый, неутомимый напарник, который при этом регулярно лажает и которого надо держать в руках. Он печатает и не устаёт, я смотрю и решаю.
Немного философии, и я закругляюсь
Вся разработка заняла примерно неделю: костяк собрался за два‑три дня, остальное ушло на тесты, фичи, опции и вот эти ночные погони за полосами и написание этой статьи. Первые три ночи я спал часа по четыре — не из‑за режима «сон для слабаков», а потому что не мог оторваться. Сидишь в три часа ночи перед экраном, запускаешь генерацию, и на твоём маленьком тихом компьютере из ничего проявляется картинка, которую ты только что описал словами. И ты тупо думаешь: как это вообще работает.
Кто‑то скажет — вайб‑кодинг, несерьёзно. Не буду спорить. Я не претендую на звание разработчика вообще, ничего такого не заканчивал, в Python понимаю чуть‑чуть, начинаю различать, где у программы что лежит, — и всё. Swift не знаю вообще. Машина писала код, я принимал решения. По мне, это честный расклад.
И тут важно сказать одну вещь без всякого высокомерия: профессионал сделает в разы лучше любого вайб‑кодера, и за серьёзной задачей всегда надо идти к специалисту. Скилл человека выше скилла машины. Машина — это бустер, а руль всё равно держишь ты. Если бы я по‑настоящему выучил язык любой, Claude Code стал бы для меня сверхсилой, и приложение вышло бы куда серьёзнее. Я этого пока не сделал и не буду (шучу возможно начну, возможно)))). И это нормально.
Мне кажется, мы попали в забавный момент. Раньше было так: либо покупаешь готовый компьютер, либо лезешь сам — разбираешься в материнке, процессоре, памяти и собираешь под себя. Либо вызываешь сантехника, либо один раз учишься менять кран своими руками. Это всегда было хобби для тех, кому интересно поковыряться. Сейчас то же самое пришло в софт — не вместо разработчиков, а рядом с ними, как Arduino и Raspberry рядом с настоящей электроникой. Только там читаешь толстые мануалы, а тут ассистент сам разжуёт любой шаг, если попросишь. Хочешь сделать для себя то, чего не купить и не найти готовым, — теперь можешь. Не нарушая ничьих лицензий, всё открытое и официальное.
Финал
Я в лёгком шоке от того, что получилось, и очень этим доволен. Делал чисто для себя — не мог найти простую штуку по принципу «поставил и пользуешься», без нод, проводов и подписок. Сделал. Открываю почти каждый день: накидать референсов под свои проекты, поиграть с идеей, просто залипнуть на том, как мысль превращается в картинку прямо тут, на столе, без облака.
А выложить решил просто потому, что вдруг кому‑то ещё это нужно так же, как было нужно мне. Бесплатно, под лицензией MIT — и собранный релиз, и исходники. Без громких слов «я научу вас жить». Просто: вот я, обычный человек, у которого была идея и немного искры, и из этого получилась рабочая вещь. И самое классное в нынешнем времени — что это вообще стало возможно за несколько вечеров.
Движок — flux-2-swift‑mlx Винсента Гурбена, ему отдельное спасибо. Если у вас Mac на Apple Silicon и такой же зуд «а можно ли локально» — попробуйте, поломайте, поковыряйте. И если найдёте, что у меня сделано криво (а вы найдёте), — напишите, я правда буду рад. Исходники и сборка — на GitHub, ссылка ниже.
ссылка на оригинал статьи https://habr.com/ru/articles/1049478/