Prefire iOS


Channel's geo and language: Russia, Russian
Category: Technologies


Чат/блог о современной 🍏iOS разработке
Пробустить канал → https://t.me/prefire_ios?boost
Автор: @barredewe

Related channels  |  Similar channels

Channel's geo and language
Russia, Russian
Statistics
Posts filter


☺️ Prefire в требованиях к вакансиям

Где-то месяц назад поставил ежедневную задачу на ChatGPT. Искать упоминания своих 'поделок': Prefire, Mewmori, Snowfall Desktop и др.

Сегодня увидел неожиданное и приятное 😁

В вакансии Lead QA Engineer в Emirates среди требований к iOS-разработке написано:
• XCUITest, Snapshot testing (Prefire)
• А для Android - Compose Testing и Paparazzi.

Причём сама вакансия ещё июльская. То есть всё это время где-то существовала вакансия в Emirates, где знание моей библиотеки было одним из требований, а я вообще об этом не знал 😅

Первый раз увидел Prefire в таком контексте. Обычно это статьи, доклады, или проекты на github. Но чтобы кто-то искал Lead QA с этим знанием, это что то новое 😁

PS: На изображении к посту - новый котик/лис, которого я добавил в последний релиз mewmori и еще кучу осенней одежды😊


🧭 Podlodka iOS Crew: разработка с AI

С 14 по 18 сентября пройдет новый сезон Podlodka iOS Crew. В этот раз в центре внимания авторов конференции то, как AI меняет iOS-разработку. Я там буду рассказывать про то, как котик видит экран через AI.

Что ждёт участников:

🍏 Стратегия внедрения терминальных ИИ-агентов и MCP-интеграции в ежедневную iOS-разработку

🍏 AI как экзокостюм мобильного разработчика: harness, skills, CLI, orchestration, validation и evals

🍏 Знания о том, как запускать локальные модели на Apple Silicon

🍏 Готовые скрипты, которые можно забрать в свой проект: шаблон рабочего пространства агента, примеры скиллов и MCP, пайплайн от Jira-задачи до Merge Request.

И это ещё не всё! Подробности о сезоне смотрите на сайте, и там же есть билеты по early-bird цене.

👉 Билеты на Podlodka iOS Crew


Кажется, мой кот начал жить своей жизнью.

Сначала друзья просто закинули Mewmori в несколько больших Telegram-пабликов. Я тогда сидел и смотрел, как внезапно растут скачивания, DAU и онбординг.

Потом про кота отдельно написал AppleInsider (кстати классный обзор вышел).

А теперь он добрался до RationalAnswer, где Mewmori уже обсуждают как «нейрокотана».

И вот это, если честно, для меня сейчас самое странное ощущение от проекта. Когда ты долго что-то делаешь сам, ты очень хорошо знаешь все кривые места:
• Где костыль.
• Где окно иногда не открывается.
• Где OCR можно сделать лучше.
• Где кот говорит какую-то ерунду.

А потом люди снаружи начинают воспринимать это уже просто как готовую штуку. Не как очередной эксперимент с локальной LLM. А как: «о, прикольный кот для Mac» или «нейрокотан».

И, кажется, именно в этот момент проект впервые становится не только твоим. Он начинает жить у других людей 😊


Нахождение текста котом Mewmori в уникальных приложениях

Что бы кот видел, я снимаю скриншот активного приложения. После перегоняю скриншот в текст через VIsion. И вот после этого идет довольно много работы, перед тем как ИИ мозг кота получит текст и понимание.

Сейчас кот перед тем как передать контекст в ИИ, немного его причесывает.

Что получаем после обычного Vision OCR (определение текста по скриншоту):

Telegram
Антон
был недавно
Маша
А ты сегодня будешь?
Да, ближе к вечеру
Работа
Prefire
12:43
12:45


По сути просто набор строк с координатами. Для маленькой модели это выглядит очень сложно и она не может связать хоть что-то по смыслу. Для этого нужен процессинг. Сам процессинг максимально простой, весь текст делится линиями, который вычисляются на основе x/y координат текста. И эти линии говорят нам о том, где примерно заголовок и тд.

А Вот что в итоге передаем в модель:

Приложение: Telegram
Чат: Антон
Статус: был недавно
Сообщения:
Антон: А ты сегодня будешь?
Я: Да, ближе к вечеру


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

А есть специфичные. Например, для Telegram я ищу самый большой разрыв по X между распознанными строками. Так можно довольно неплохо понять, где заканчивается список чатов и начинается сам чат.

И после процессинга кот уже начинает забавно шутить. Он может не просто сказать что-то про текущий диалог, а запомнить, что я уже общался с этим человеком. А через какое-то время спросить что-нибудь типа: «Вы давно дружите?» 😼

Пока всё это набор эвристик под конкретные приложения. Но мне прям нравится, насколько сильно такая простая предобработка меняет ощущение от маленькой локальной 2B модели.


Начал готовить к релизу ScreenCat - 🐈 Mewmori

- Переименовал проект в Mewmori (типо memory - память, но измененное под мяу)
- Cделал большой редизайн и кучу внутренних оптимизаций, что бы кот не кушал всю батарею и ресурсы на mac. Потестил даже на Mac M1 - работает отлично.
- Сейчас активно готовлю контент для соц. сетей. И даже некоторый уже выложил.

В целом, проект именно по добавлению фич - заморозил. Он уже очень сильно разросся и вышел за пределы котика (ассистент, игры и тд). Это мне позволило переключиться именно на продвижение)

А сверху видео для рилса, которое я сделал полностью кодом:
1. Написал промо сценарий
2. Cделал фейковый рабочий стол
3. На питоне сделал запись экрана и подстановку музыки

Теперь клипаю ролики спокойно, написав один простой json с сценарием этого ролика 😊
  "name": "intro-ru",
  "settle": 1.0,
  "tail": 1.0,
  "steps": [
    { "action": "move", "x": 0.47, "y": 0.20, "style": "teleport" },
    { "action": "look", "skin": "classic_cat" },
    { "action": "mood", "value": "sleeping" },
    { "action": "wait", "seconds": 1.6 },

    { "action": "mood", "value": "interacting", "direction": "right" },
    { "action": "effect", "value": "surprise" },
    { "action": "say", "text": "Ой. Ты меня видишь?", "hold": 2.0 },

    { "action": "say", "text": "Я Mewmori. Живу у тебя на рабочем столе.", "hold": 3.2 },
  ]


Сделал систему скинов для котиков 🐈

В ScreenCat уже много скинов, и я прям сильно устал рисовать и подгонять каждый вручную в Figma. Особенно когда меняется поза, а вместе с ней нужно поправить голову, хвост, лапы, глаза и ещё десяток мелочей.

Посидел вместе с Claude и подумал: а что, если создание скина будет больше похоже на написание кода, чем на ручную сборку иллюстрации?

В итоге собрал data-driven систему на JSON. Теперь визуальная часть кота состоит из трёх уровней:

1. skin.json - описание конкретного кота: его части, текстуры, позиции, порядок слоёв, точки крепления аксессуаров и настройки взгляда.

2. JSON-клипы анимаций - описывают движение частей: подпрыгивание тела, поворот хвоста, наклон головы, моргание.

3. animations.json — граф состояний: когда кот сидит, бежит, спит, реагирует на действие или переключается между анимациями.

{
"id": "ginger_fold_cat",
"rig": {
"parts": [
{ "id": "body", "texture": "body.png", "position": [-5, -22] },
{ "id": "tail", "texture": "tail.png", "parent": "body", "position": [32, -12] },
{ "id": "head", "texture": "head.png", "parent": "body", "position": [-10, 41] }
]
}
}

Риг это иерархия частей внутри скина. Например, хвост прикреплён к телу, а глаза к голове. Поэтому при движении головы всё нужное едет вместе с ней.

Анимации задаются не абсолютными координатами, а дельтами от базовой позы. Один и тот же клип бега можно применить к разным котам, даже если у них разная форма тела или хвоста:

{
"part": "tail",
"property": "rotation",
"keys": [[0, 0], [0.14, 18], [0.42, -18], [0.56, 0]]
}


То есть здесь хвост просто отклоняется от своего обычного положения на 18 градусов туда и обратно. Клипу не нужно знать, где хвост находится у конкретного скина.

В итоге новый скин - это набор PNG и JSON, а не пачка исключений в коде. Можно менять пропорции, добавлять образы и анимации, а валидатор сразу проверит, что все части, текстуры и связи на месте.

PS: После написания json - скрипт прогоняет рендеринг PNG через ffmpeg

А дальше я навайбкодил UI на Tauri, чтобы работать со скинами было ещё удобнее.
Про редактор, генерацию арта и весь этот пайплайн расскажу в следующих постах.


Кажется, Prefire полюбили в Японии 🇯🇵

Только вернулся из отпуска в Японии и, пока был там, случайно наткнулся на статью японской компании PREVENT не спрашивайте что это за компания, сам не знаю.

Они подробно рассказали, как используют Prefire в продакшн-разработке для snapshot-тестов. Ой как приятно 🥹

Самое интересное, что у них весь пайплайн построен на Prefire без каких-либо своих доработок. Именно так я его когда-то и задумывал и использовал.

Из интересных моментов: ребята из PREVENT фиксируют Locale и другие параметры окружения, чтобы уменьшить количество флаков. А при падении CI сохраняют весь .xcresult, чтобы потом удобно разбирать проблему локально. Честно говоря, про такой подход я сам даже не думал 😄

И это, как оказалось, не единичный случай. Уже после статьи начал копать дальше и выяснил, что в Японии было несколько конференций, митапов и статей, где обсуждали Prefire и работу с ним. Вообще не ожидал, что именно там вокруг проекта будет такая активность.

В целом мега приятно такое находить. Очень мотивирует продолжать развивать проект. Прямо сейчас заканчиваю поддержку macOS - PR уже открыт 🚀


Хочу рассказать одну довольно личную историю 💀

Несколько лет назад я пришел в одну компанию строить приложение практически с нуля. Новый стек, новая команда и вообще новый для меня вызов.

Все получилось. Команда выросла до 30+ человек.

Я не только писал код, но и много вкладывался в людей. Собеседовал, нанимал, старался продвигать ребят: конференции, обучение, open source и все такое. Было очень приятно видеть, как люди растут.

Но дальше пошла череда неудач.

Постепенно у меня забирали команды, которые я сам собирал. В итоге спустя пару лет я вообще остался без команды и стал индивидуальным контрибьютором (экспертом).

Я очень тяжело это пережил.

Наверное, только спустя время понял, насколько сильно работа может влиять на жизнь. Постоянный стресс, моральная усталость, еда как самый простой способ отвлечься. За это время я набрал больше 50 кг.

Потом в какой-то момент решил, что так дальше нельзя.

Начал заниматься спортом.

Сначала просто хотелось снова нормально себя чувствовать. Потом втянулся. Постепенно похудел, подкачался, вернулась энергия. А уже после этого нашел новую классную работу.

Наверное, это довольно стандартная история в IT. Да и не только в IT.

Но для себя я вынес один очень важный инсайд:
здоровье > любой работы

Никакой проект, должность или зарплата не стоят того, чтобы настолько забивать на себя.

Работу можно поменять. А здоровье вернуть намного сложнее.

844 0 11 18 115

Обновления в 🔥Prefire

Prefire, если кто-то вдруг пропустил, это мой инструмент для SwiftUI/UIKit #Preview.

Он берет превьюхи и на их основе генерирует snapshot-тесты и Playbook.

Из свежего я добавил установку через Mint:
mint install BarredEwe/Prefire

Теперь Prefire можно ставить через Brew, SPM, Xcode Plugin и Mint.

А еще за последнее время в проект прилетело очень много крутых доработок контрибьютов ❤️

Например, добавили split_snapshot_directories.
Это флаг, который раскладывает снапшоты по папкам исходных файлов. Когда превьюх много, это сильно удобнее, чем одна огромная папка со всем подряд.

Плюс поправили несколько неприятных кейсов:
- исправлена проблема с определением пути к yml конфигу;
- @Previewable;
- креш, если после #Preview идет перенос строки;
- настройку drawHierarchy.

И я думаю, сейчас Prefire стал еще актуальнее.
UI все чаще пишется с помощью ИИ. Агент может быстро накидать экран, поменять компоненты, поправить состояние. Но после этого все равно нужен какой-то быстрый способ понять: он визуально ничего не развалил?

(Надо продумать этот кейс подробнее, может mcp сделать)

Snapshot-тесты из #Preview как раз хорошо закрывают этот сценарий.

GitHub:
https://github.com/BarredEwe/Prefire

Буду рад звездам, ишьюсам и особенно фидбеку от тех, кто попробует у себя.


🐈 Решил заняться своим старым проектом «ScreenCat».

Вот, например, старый пост: https://t.me/prefire_ios/116

Обновил llama.cpp, полностью ушел от LLM.swift к самописному (ага, конечно, навайбкоденному 😁) бриджу на Swift со всеми новыми фишками, типа спекулятивного выполнения и так далее.

Но это не главное. У кота сейчас модель довольно большая - Qwen 3.5 2B или 4B на выбор. Это нагружает компьютер.

Вот решил выбрать модель поменьше, MiniCPM 1B, и дообучить её через LoRA под конкретную задачу. В этом помогла как раз ИИшка.

Из этапов, без большого погружения, выглядит так:

1. Сначала качаем модель.
2. Потом нужно найти или сгенерировать датасет. Так как мне нужны фразы котика, такого датасета я не нашел. Так что с помощью другой модели (Qwen 3.6 35B) начал генерацию. Если интересно, что и как, могу сделать отдельный пост.
3. Дальше с помощью датасета и самой маленькой модели обучаем её. Одна команда в терминале, сам удивлен, что так легко.
4. Наслаждаемся результатом 😁

На самом деле результат очень плохой 🤡

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

Буду рад послушать предложения и исправления.


Пока только прошло WWDC (мне кстати не понравилось), разбавлю немного постом про инструменты , которыми пользуюсь.


Недавно открыл для себя довольно новый терминал для macOS - CMUX.

Неожиданно зашло 😁

Самое полезное для меня это сплиты. Очень удобно делить окно и держать рядом несколько сессий opencode (или других *code-агентов).

Когда параллельно работаешь над несколькими задачами (а даже скорее проектами), фича топ.

Еще понравились уведомления. Можно переключиться на другую задачу и не сидеть, уставившись в терминал в ожидании ответа агента. CMUX уведомляет если агенту что то нужно или он завершил работу.

В итоге настолько привык к нему, что полностью переехал со стандартного терминала macOS.

Не скажу, что это какой-то революционный инструмент. Но если активно используете opencode, Codex, Claude Code, Gemini CLI или другие агентные инструменты, то CMUX именно под такой сценарий работы (да и для других тоже норм).

CMUX на GitHub⁠

758 0 12 14 12

14 апреля покажу, как можно пройти собеседование по системному дизайну.
Или как его завалить.

Формат интересный: буду решать задачу с полным доступом к ИИ. Близко к реальности - как ты думаешь, что отдаёшь агентам, как проверяешь результат и к какому решению приходишь.

Я к этому заранее подготовил скилы и агентов, так что самому уже интересно, что из этого получится 💥

14 апреля 17:00 подключайтесь посмотреть и пообщаться вживую:
📹 YouTube: https://www.youtube.com/watch?v=-ZyVpAzCf2E

572 0 17 9 25

🎉 Результаты розыгрыша:

🏆 Победители:
1. David (@davidbayramo)
2. Тимур (@timnur)
3. Timofey (@bytim)
4. Musa (@musamuss)

✔️Проверить результаты


🚬 Розыгрыш 4 промокодов на Podlodka iOS Crew

Я сам тоже буду участвовать в этом сезоне. Будет публичное собеседование, где я буду задавать примерно те же вопросы, которые обычно задаю кандидатам к себе в core-команду. Ну и в целом мне просто близка вся эта тема с внутренностями системы, так что за сезон прям топлю.

Результаты будут 10 апреля в 18:00 🎁

Сам Crew пройдет с 13 по 17 апреля, тема сезона — «Фундаментальный iOS». Там будет прям глубокое погружение в системные штуки.


🧭 Погружаемся в iOS вместе с Podlodka iOS Crew

Работа с iOS — это не только про красивый фронтенд. С 13 по 17 апреля пройдет новый сезон Podlodka iOS Crew — «Фундаментальный iOS».

В этот раз организаторы планируют супер глубокое погружение в то, как устроена операционная система. Мне в целом очень близка эта тема - как лиду платформы.

💡Участники конференции:


• погрузятся в детали Swift Generics и Swift Dictionary,

• узнают, как создать свою ферму виртуальных iPhone с настоящей iOS,

• разберут актуальные подходы работы с Metal
и Core Image,

• погрузятся в то, как внедрить современные мультимодальные LLM в приложения для iPhone, используя аппаратные возможности устройств,

• пройдут по процессу собеседования вместе с тимлидом платформенной команды (это я 👉).

Всё это — в формате утренних и вечерних Zoom-сессий и общения с коллегами в закрытой группе Telegram.

🧠Если вы хотите обновить свои знания о фундаментальных основах iOS и погрузиться в практику вместе с опытными экспертами, подключайтесь к Podlodka iOS Crew👇

🔗 Посмотреть программу и присоединиться

А промокод ios_crew_17_o35WAv дает скидку 500р🎁


Реализнули Swift 6.3

Этот релиз в первую очередь про кроссплатформу: Android, C interop, build tooling, embedded.

Появился первый официальный Swift SDK for Android, а в SwiftPM завезли preview нового Swift Build, чтобы сборка была более нормальной и единообразной на разных платформах.

Для меня самое интересное тут это @c атрибут. Потому что почти все llm библиотеки написаны прежде всего на C/C++, а остальное это уже обертки. У меня есть своя обертка над llama swift, так что попробую там применить.

Еще из полезного:
👉 в DocC добавили поддержку symbol links на overload groups и расширили кастомизацию Generated C/C++ API docs,
👉 завезли module selectors вида ModuleA::foo(), чтобы нормально разруливать одинаковые имена из разных модулей.

850 0 16 4 14

Держите свежую фоточку с Recrent 😎

Я тут вспомнил что давно ничего не постил (новостей кроме блокировок и нет нормальных).

Все так же делаю приложение для блогеров в свободное время. Все так же в LLM копаю. Очень удивил Qwen 3.5 который даже на утюге работает просто шикарно. Его кстати и использую в приложении.

По мобиусу готовим классную программу, почти все слоты уже закрыли, все финалим.

Пока сидел тут на стримерском мероприятии, ко мне пару раз походили и просили сфоткаться, так как перепутали меня с Recrent 🤡


Xcode MCP с поддержкой скриншотов

В свежем релизе Xcode 26.3 появилась новая фича - интерфейс MCP, позволяющий ИИ видеть интерфейс приложения.

Теперь Claude Code может делать скриншоты текущих вью прямо в Xcode, анализировать их и на основе увиденного вносить конкретные правки в код.

MCP подключается к Claude Code и Codex (да и почти ко всем сервисам) через xcrun mcpbridge. Это удобно, так как ИИ теперь видит результат своей работы.

Пример установки в Codex или Claude:
codex mcp add xcode -- xcrun mcpbridge
claude mcp add --transport stdio xcode -- xcrun mcpbridge


Продолжаем про ИИ проект для блогеров

Отдельная боль - UI.

Я почему-то думал, что Kotlin Compose Desktop делает нативный интерфейс.
Спойлер: нет.

По факту это web под капотом, со всеми вытекающими.

Чтобы сделать простейший header окна, пришлось:
– лезть в нативный код под macOS
– отдельно разбираться с Windows
– потом тестировать всё это как отдельный проект

Для вещи, которая в нативе решается за вечер.

Из неожиданного хорошего - сборка под две платформы оказалась простой.
Это, пожалуй, единственный момент, где ожидания совпали с реальностью.

🫡 Итог простой.

Связка Python + Kotlin - жизнеспособная.
Но я не советую её вообще никому.

Это постоянное ощущение, что ты живёшь на стыке костылей, и любое обновление может что-то сломать в месте, куда ты даже не смотрел.

Если бы начинал заново - попробовал бы Swift как мультиплатформу.
Или честно писал бы два нативных приложения.

Что сами думаете, что сделали бы в такой же ситуации и какой стек выбрали?


Делаю сейчас ИИ-проект для блогеров.
Если доделаю - расскажу отдельно

Но есть одна проблема: аудитория не только на macOS, но и на Windows (а я супер герой, который хочет в одиночку сделать продукт 🤡).
И вот тут я решил попробовать кроссплатформенный desktop.

Смотрел Flutter и Tauri.
В итоге выбрал KMP + Kotlin Compose Desktop. Причина простая: Kotlin очень похож на Swift, а Swift - мой основной язык. Тогда это казалось очень логичным.

KMP сам по себе не плох.
Но экосистема - крошечная. Фреймворков и готовых решений почти нет. Не «мало», а именно почти ничего. Возможно, я плохо искал, но ощущение именно такое.

В какой-то момент я сдался и вынес core (всякие шаманства с ии и тд) на Python.
И вот тут началась настоящая боль.

Python это:
– слабый перфоманс
– бешеный размер приложения из-за скрытых зависимостей (привет whisper и llama)
– сборка, похожая на лотерею

Самое большое разочарование - невозможность без костылей собрать бинарник, который нормально и стабильно используется из Kotlin.

Сейчас core слой на Python шарится между Windows и macOS, сверху Kotlin-проект.
Работает. Но ценой постоянного внутреннего дискомфорта.

Продолжение ниже 👇

20 last posts shown.