Картинки рвало полосами, а файлы при этом были чистыми. Apple Silicon.. Apple Silicon. flux.2.. Apple Silicon. flux.2. Klein.. Apple Silicon. flux.2. Klein. macOS.. Apple Silicon. flux.2. Klein. macOS. mlx.. Apple Silicon. flux.2. Klein. macOS. mlx. on-device AI.. Apple Silicon. flux.2. Klein. macOS. mlx. on-device AI. Open source.. Apple Silicon. flux.2. Klein. macOS. mlx. on-device AI. Open source. Swift.. Apple Silicon. flux.2. Klein. macOS. mlx. on-device AI. Open source. Swift. генерация изображений.. Apple Silicon. flux.2. Klein. macOS. mlx. on-device AI. Open source. Swift. генерация изображений. искусственный интеллект.. Apple Silicon. flux.2. Klein. macOS. mlx. on-device AI. Open source. Swift. генерация изображений. искусственный интеллект. локальная нейросеть.. Apple Silicon. flux.2. Klein. macOS. mlx. on-device AI. Open source. Swift. генерация изображений. искусственный интеллект. локальная нейросеть. Ненормальное программирование.

Три ночи я был уверен, что у меня сломан рендер.

Вертикальные картинки — те самые 9:16, под обои телефона и под сторис, — на экране разъезжались горизонтальными полосами. Как будто старый телевизор поймал помехи. Квадрат рисуется нормально. Горизонталь — нормально. А вертикалку рвёт в труху.

Три раза я её «починил». И все три раза чинил вообще не то.

Правда оказалась дурацкой и красивой одновременно: файлы были в полном порядке. Рвало только то, как macOS показывала их на экране. Но к этому моменту я уже немного поседел.

Это не история из серии «смотрите, какой я молодец». Это честный рассказ, как обычный человек без программистского образования за неделю собрал себе на Mac локальный генератор картинок — и на какие грабли наступил по дороге. Я энтузиаст, не разработчик. И сразу самое важное, чтобы потом не было неловко: я не написал ни одной строчки кода. Ни единой. Даже Xcode толком не открывал. Код писал вместе со мной Claude Code, модель Opus 4.8. И сам движок генерации — тоже не мой. А моё во всём этом — то, что движок не топит ваш Mac и не показывает вам битые картинки. Звучит мелко? Вот про эту мелочь и весь рассказ. Прятать тут нечего, про границы расскажу честно прямо сейчас.

Знакомитесь это Typhoonminigen

Знакомитесь это Typhoonminigen

Сразу про границы: что моё, а что чужое

Разложу всё сходу, иначе первый же комментарий будет «да ты вообще ничего не сделал».

Движок, который реально рисует картинки на 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, и он многоязычный. То есть мою фразу в понятный модели вид превращает часть, которая знает русский напрямую. Никакого шага «сначала переведём на английский» — пишешь по‑русски, и оно работает. Лично для меня это оказалось одной из самых уютных вещей. Думаешь на родном языке, рисуешь на родном языке.

Typhoonminigen раздел Model

Typhoonminigen раздел Model

Детектив первый: полосы были на экране, а не в файле

Вернёмся к тем вертикалкам.

Симптом: 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», а именно то, как ты описал освещение. Поменяешь одну фразу про свет — и кадр будто заново родился. Попробуйте.

А раз накрутить шаги нельзя (модель дистиллирована, я уже ныл про это), то единственный руль качества — это сам промпт. И я полез строить инструмент, который помогает писать эти фразы правильно. Сначала — простые кнопки‑чипы: тип света, объектив, ракурс, стиль. Тыкаешь — фраза сама дописывается в нужном порядке. Не надо помнить, как по‑английски звучит «мягкий рассеянный свет от большого источника». Но английский надо учить все равно!

А потом меня понесло. Из этого выросла целая Библиотека: куча чипов по свету, объективу, кадру, цвету, среде — пара сотен, если по‑честному, — плюс под сотню готовых сцен‑рецептов. Жмёшь карточку «продуктовый кадр на бетоне» — подставляется и текст, и нужные настройки, только впиши свой объект, и погнал. На это я потратил очень много времени, собрать готовые пресеты/промты.

Библиотека готовых preset / promt

Библиотека готовых preset / promt

И тут начались мои любимые грабли.

Софтбоксы в кадре. Световые чипы я назвал честно, по‑фотографски: «софтбокс», «трёхточечная схема». Звучит профессионально. Запускаю — а Klein берёт и рисует мне эти софтбоксы прямо в кадре. Не свет от них — а сами железки, висящие за моделью. Я сначала вообще не понял, откуда в студийном портрете осветительные стойки. А потом дошло: text‑to‑image понимает существительные буквально. Сказал «софтбокс» — получи софтбокс. Переписал световые чипы так, чтобы в промпт уходило описание света, а не прибора, — стало заметно чище. Но, скажу честно, до конца я эту заразу так и не вывел: само слово «студия» в описании фона нет‑нет да и притащит в кадр пару стоек — Klein понимает «фотостудию» слишком буквально. Так что если на каком‑то пресете вы поймаете софтбокс на заднем плане — вы не одни, я с ним ещё воюю.

Иллюминатор. А этот красивый. Несколько совершенно разных пресетов — 90-е, хоррор, романтика, VHS — почему‑то выходили «в кружочке», с круглой виньеткой по краям, будто смотришь в иллюминатор. Долго не мог понять, что их роднит. Оказалось — один общий чип с фразой про «сферический объектив» и «виньетку». Klein услышал и «сферический объектив», и «виньетку» — и честно обвёл кадр круглой рамкой. Убрал эти слова, переписал на «мягкий фокус, спад по краям» — иллюминаторы испарились.

Провал интерьеров. А вот это я заслужил по полной. Восемь рецептов комнат я собрал и выкатил, не глянув на результат глазами. Открываю по‑человечески — а там выцветшие коробки. Один диван посреди пустоты. Стыдно. Поставил себе мысленную единицу из пяти. Причина дурацкая: рецепт описывал ровно один предмет мебели плюс «приглушённые цвета» — вот и вышла блёклая пустота. Переписал все восемь в нормальные комнаты — мебель, ковёр, текстиль, тёплый свет, «как на развороте журнала по дизайну». И в этот раз отрендерил каждую и посмотрел, прежде чем сказать «готово».

Ловил я всё это не на глаз по одной картинке. Я нагонял рои проверок, которые реально читали отрендеренные PNG: открывали картинку, открывали вшитый прямо в файл рецепт и сверяли — что просил, что вышло. Сотня кадров за раз. Так и всплыли софтбоксы, и иллюминаторы, и блёклые комнаты. И да, про то, что приложение честно НЕ умеет, я тоже не молчу: прямо в Библиотеке висит красная панель «вот это не получится», чтобы вы не упёрлись в стену, про которую я промолчал.

Картинки рвало полосами, а файлы при этом были чистыми - 4

Что приложение честно НЕ умеет

Вот это, наверное, важнее всех красивых фич. Я знаю потолок движка — поэтому без иллюзий, красным по белому. Половина разочарований берётся из завышенных ожиданий, и мне хочется, чтобы у вас их не было.

Видео — нет, вообще. LoRA‑адаптеров (это маленькие «довески» к модели, которые меняют стиль или подсовывают конкретного персонажа) можно подключить максимум два — жёстко зашито, и на 4B, и на 9B. Своих картинок‑референсов — максимум три. Обучить свою LoRA прямо в приложении или вообще на Маке нельзя: обучению нужны десятки гигабайт памяти под обратный проход, машина столько не даст. LoRA тренируют не здесь, а в облаке, на специальных тренерах поверх базовой Klein-9B, и уже готовый файл .safetensors ты подгружаешь в приложение. Никакого «обучения на устройстве» я не обещаю — это было бы враньё.

LoRA‑адаптеры

LoRA‑адаптеры

Шагов всегда четыре. Модель дистиллирована под четыре, и больше не значит лучше — просто не будет. Негативного промпта нет: нельзя сказать «только без собак». Никакого inpaint, масок и дорисовки за краями: референс — это пересборка всей сцены заново, а не точечная замена одного куска, как многие ждут. Поменять один объект, оставив остальное на месте, нельзя. ControlNet, позы, карты глубины — мимо. Веса в промпте вида (красный:1.5) движок просто игнорирует — ему нужны нормальные человеческие фразы, а не теги с цифрами. Выбора семплера и числа шагов нет.

И самое незаметное, но честно самое болезненное ограничение, о котором почти никто не думает заранее: нет консистентности между генерациями. Каждый рендер живёт сам по себе. Нельзя нарисовать одного и того же персонажа в серии из десяти картинок, или один товар с разных ракурсов, или одну и ту же комнату. Каждый раз заново и по‑новому. Для комикса или продуктовой съёмки это приговор, и врать тут смысла нет.

Текст на картинках выходит так себе, особенно на четырёх шагах. Анатомия тоже не идеальна — руки, пальцы ( для этого и есть LoRA адаптеры с отличной анатомией), толпа на заднем плане могут поплыть. У меня как‑то йог получился с четырьмя руками, и я чуть не записал результат в «отличные», пока не пересчитал конечности. Сладкая зона по разрешению — около одного мегапикселя; выше примерно 1.05 МП качество начинает заметно проседать, пойдут мутации. И один запущенный рендер нельзя оборвать мгновенно: движок на каждом шаге уходит в плотный расчёт и на «стоп» отвечает не сразу.

Я мог бы попробовать прикрутить негативы, маски, ControlNet и подать это как «полнофункциональный генератор». Не стал. Движок этого честно не тянет, а лепить кривые костыли поверх того, что не задумано, — так себе идея. Если человек поставит софт и упрётся в стену, про которую я молчал, это будет нечестно. Пусть лучше приложение делает мало, но честно. А заодно этот список доказывает, что я реально разобрался в движке, а не просто нажал «собрать».

А что тогда умеет — и зачем оно мне

Теперь про хорошее. Но не списком, а по‑человечески — через то, ради чего я этим пользуюсь почти каждый день.

Русский промпт напрямую. Я пишу «уютная кухня в скандинавском стиле, утренний свет из окна» — и не думаю ни про какой перевод. Тот самый многоязычный энкодер делает всё сам, слова сразу уходят в картиночную модель. Для меня это просто сняло целый пласт мороки: не надо держать в голове английский и гадать, правильно ли я перевёл «приглушённый свет». А рядом есть кнопка «улучшить промпт»: написал коротко и криво, поставил галочку — и формулировка раскрутилась в нормальную.

Русский Промт без проблем, любой язык

Русский Промт без проблем, любой язык

Два размера и авто‑защита от свопа. Приложение само смотрит, сколько у тебя памяти, и не даёт выстрелить себе в ногу: на скромных машинах типа 8GR RAM честно рекомендует 4B, а 9B врубается, когда памяти точно хватает. На моих 32 гигах девятимиллиардная модель в пике ест где‑то 19–20 гигабайт, и свопа — ноль. Это, между прочим, маленькое чудо: что такая махина вообще помещается и считает на настольном мини, который меньше книги. И да, это та самая защита, ради которой я городил весь огород с замерами памяти.

Описание по фото. Кидаешь скриншот или фотографию — лёгкая модель её разбирает и выдаёт текстом, что на ней. Удобно, когда увидел красивый кадр и хочешь «так же, но своё». И без двадцатичетырёхгиговой бомбы — спасибо предохранителю ( привет Mistal 24B)

Рецепт прямо в картинке. Каждая сохранённая картинка несёт внутри себя свой «рецепт» — промпт и сид. Перетащил файл из галереи на рабочий стол, потом обратно в приложение — и оно вытащило все параметры. А ещё есть «ремикс»: жмёшь кнопку в галерее, промпт и настройки сами подставляются в форму, дописал пару слов — и погнал заново. Про сид коротко: фиксированный сид даёт ровно ту же картинку каждый раз (воспроизводимость), а случайный — разные варианты. Один и тот же промпт я часто прогоняю на случайном сиде несколько раз, просто чтобы посмотреть, какие бывают варианты, и выбрать лучший.

Карточка картинки в Gallery

Карточка картинки в Gallery

Есть ещё по мелочи, но очень важные фишки: очередь рендеров, галерея с зумом, телеметрия памяти, скрытие панелей, туториал при первом запуске и стирание всех данных в один клик — чтобы после меня не оставалось ни кэша, ни мусора. Но это уже обвес. Сердце — четыре штуки выше.

Typhoonminigen раздел Gallery

Typhoonminigen раздел Gallery

Про железо, без вранья

Честные порядки величин, без точных цифр там, где я в них не уверен.

Картинка примерно 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, ссылка ниже.

[ссылка на GitHub]

Автор: abgitdev

Источник