🧠 За милой мордочкой ScreenCat скрывается ИИ-движок.
Я встроил прямо в приложение бинарь Ollama — он запускается локально при первом старте и предлагает скачать модель LLaMA 3.1 8B. Всё оффлайн, всё приватно. Такой модели хватает для умного котика🙂
Кот работает на системе промптов: я формирую для него описание окружения и текущего состояния — и модель решает, что делать. Например, если он голоден, рядом открыт Xcode, и на экране ошибки — он может подойти и «пожалеть» разработчика.
Инфу кот получает из окна вокруг себя — область 400×400px. Чтобы увидеть остальной экран, ему нужно ходить. Это не абстрактный ИИ — он реально «смотрит» на экран и воспринимает только то, что рядом.
Контент из приложений читаю через Vision, чтобы понять, что именно там происходит: код, сообщения, статьи и т.д. Всё это добавляется в prompt — и кот реагирует.
Скоро покажу примеры того, как он ведёт себя в разных ситуациях.
#screencat #ai
Я встроил прямо в приложение бинарь Ollama — он запускается локально при первом старте и предлагает скачать модель LLaMA 3.1 8B. Всё оффлайн, всё приватно. Такой модели хватает для умного котика
Кот работает на системе промптов: я формирую для него описание окружения и текущего состояния — и модель решает, что делать. Например, если он голоден, рядом открыт Xcode, и на экране ошибки — он может подойти и «пожалеть» разработчика.
Инфу кот получает из окна вокруг себя — область 400×400px. Чтобы увидеть остальной экран, ему нужно ходить. Это не абстрактный ИИ — он реально «смотрит» на экран и воспринимает только то, что рядом.
Контент из приложений читаю через Vision, чтобы понять, что именно там происходит: код, сообщения, статьи и т.д. Всё это добавляется в prompt — и кот реагирует.
Скоро покажу примеры того, как он ведёт себя в разных ситуациях.
#screencat #ai
Please open Telegram to view this post
VIEW IN TELEGRAM
🧪 Стек ScreenCat
Вообще стек довольно простой. Старался брать минимум зависимостей для меньшего размера. Опыт с SpriteKit у меня уже был, на самой первой работе. Писал там игру 2D scroll shooter.
🐱 UI — SwiftUI: меню, баблы, панели. Всё кастомное, даже Shape для кнопок.
🧵 SpriteKit: хвост анимируется шейдерами, глаза моргают, тело дышит — всё процедурно. Сам кот состоит из хвоста, глаз и тела. Маловато конечно для крутых анимаций, но уже выглядит живо.
🧠 Ollama + LLaMA 3: локальная LLM встроена прямо в .app, скачивает модель при первом запуске.
🪟 Vision: кот реально «смотрит» на окна и читает, что на экране.
🧠 PromptBuilder: собирает контекст из нужд кота, окружения и текста с экрана.
🔄 CatEngine — мини-движок сценариев. Есть очередь, прерывания, заморозка и логика приоритетов. На сценариях я пишу вообще все, открытие меню, ходьбу котика, игры с ним и тд.Приложил скриншот как раз с уже готовыми сценариями 😏
🔋 DisplayLink: анимации хождения по экрану + некоторые игры.
💾 UserDefaults + Cache: всё, что кот знает, он помнит. Даже как ты его звал.
#screencat
Вообще стек довольно простой. Старался брать минимум зависимостей для меньшего размера. Опыт с SpriteKit у меня уже был, на самой первой работе. Писал там игру 2D scroll shooter.
🐱 UI — SwiftUI: меню, баблы, панели. Всё кастомное, даже Shape для кнопок.
🧵 SpriteKit: хвост анимируется шейдерами, глаза моргают, тело дышит — всё процедурно. Сам кот состоит из хвоста, глаз и тела. Маловато конечно для крутых анимаций, но уже выглядит живо.
🧠 Ollama + LLaMA 3: локальная LLM встроена прямо в .app, скачивает модель при первом запуске.
🪟 Vision: кот реально «смотрит» на окна и читает, что на экране.
🧠 PromptBuilder: собирает контекст из нужд кота, окружения и текста с экрана.
🔄 CatEngine — мини-движок сценариев. Есть очередь, прерывания, заморозка и логика приоритетов. На сценариях я пишу вообще все, открытие меню, ходьбу котика, игры с ним и тд.
🔋 DisplayLink: анимации хождения по экрану + некоторые игры.
💾 UserDefaults + Cache: всё, что кот знает, он помнит. Даже как ты его звал.
#screencat
This media is not supported in your browser
VIEW IN TELEGRAM
🎮 Меню для ScreenCat — в духе Persona 5
Решил, что котик заслуживает стильного интерфейса. Сделал радиальное меню, которое появляется вокруг него — с анимацией, тенями и скошенными кнопками.
Технически:
👉 Меню написано на SwiftUI
👉 Каждая кнопка — кастомная Shape с гранями, как в Persona
👉 Кнопки располагаются по кругу, рассчитываются через угол + радиус
👉 При наведении — лёгкая 3D деформация и тень
👉 Есть эффект «разворота», если угол большой — текст поворачивается, чтобы быть читаемым
👉 Под котом появляется фон, подчёркивающий действия
Интересно было балансировать читаемость, кликабельность и стиль. Теперь меню реально ощущается частью персонажа, а не просто интерфейсом.
#screencat
Решил, что котик заслуживает стильного интерфейса. Сделал радиальное меню, которое появляется вокруг него — с анимацией, тенями и скошенными кнопками.
Технически:
👉 Меню написано на SwiftUI
👉 Каждая кнопка — кастомная Shape с гранями, как в Persona
👉 Кнопки располагаются по кругу, рассчитываются через угол + радиус
👉 При наведении — лёгкая 3D деформация и тень
👉 Есть эффект «разворота», если угол большой — текст поворачивается, чтобы быть читаемым
👉 Под котом появляется фон, подчёркивающий действия
Интересно было балансировать читаемость, кликабельность и стиль. Теперь меню реально ощущается частью персонажа, а не просто интерфейсом.
#screencat
DeepWiki — что за сервис и стоит ли его пробовать?
DeepWiki — это веб-платформа от Cognition AI (релиз 25 апреля 2025 г.), которая по запросу создаёт wiki-страницу для любого публичного GitHub-репозитория. Достаточно заменить github.com на deepwiki.com в URL, после чего открывается сгенерированное «досье» на проект — со структурой файлов, диаграммой зависимостей и встроенным чат-ассистентом Devin.
Мой опыт использования
Когда я открыл свой репозиторий Prefire в DeepWiki, сервис вывел жирным заголовком фразу “Define Once, Use Everywhere”. Забавно: эта мысль действительно лежала в основе библиотеки — мы описываем UI-превью один раз (через #Preview или PrefireProvider), а дальше они превращаются и в снапшот-тесты, и в живую демку. Но сформулировать это как чёткий принцип я раньше не догадался, а в README он мелькал только намёками.
Было круто посмотреть как мой репозиторий виден со стороны 😏
#ai
DeepWiki — это веб-платформа от Cognition AI (релиз 25 апреля 2025 г.), которая по запросу создаёт wiki-страницу для любого публичного GitHub-репозитория. Достаточно заменить github.com на deepwiki.com в URL, после чего открывается сгенерированное «досье» на проект — со структурой файлов, диаграммой зависимостей и встроенным чат-ассистентом Devin.
Мой опыт использования
Когда я открыл свой репозиторий Prefire в DeepWiki, сервис вывел жирным заголовком фразу “Define Once, Use Everywhere”. Забавно: эта мысль действительно лежала в основе библиотеки — мы описываем UI-превью один раз (через #Preview или PrefireProvider), а дальше они превращаются и в снапшот-тесты, и в живую демку. Но сформулировать это как чёткий принцип я раньше не догадался, а в README он мелькал только намёками.
Было круто посмотреть как мой репозиторий виден со стороны 😏
#ai
DeepWiki
BarredEwe/Prefire | DeepWiki
Prefire is a library designed to automate the generation of UI component documentation and visual regression tests from SwiftUI Preview declarations. It leverages your existing SwiftUI previews to cre
📌 TL;DR
👋 Привет, ты в Prefire iOS - блоге о живой iOS (и не только) разработке.
⚡️ Архитектура, DI и модульность без святых войн
🛠 CI / CD, кэширование билдов, инструменты перфоманса
🎨 SwiftUI‑сниппеты, анимации и UI‑фишки
🤖 Локальные LLM и AI‑эксперименты в продакшен‑коде
🎙 Опросы + дискуссии по свежему WWDC и релизам Xcode
👉 Добро пожаловать!
👋 Привет, ты в Prefire iOS - блоге о живой iOS (и не только) разработке.
⚡️ Архитектура, DI и модульность без святых войн
🛠 CI / CD, кэширование билдов, инструменты перфоманса
🎨 SwiftUI‑сниппеты, анимации и UI‑фишки
🤖 Локальные LLM и AI‑эксперименты в продакшен‑коде
🎙 Опросы + дискуссии по свежему WWDC и релизам Xcode
👉 Добро пожаловать!
🗂 Навигация
#blog - Размышления, впечатления, обзоры, новости
#tools - О фреймворках, приложениях и прочих тулзах
#ai - Все об ai в Apple разработке (LLM, MLC, Ollama, LLM.swift и тд)
#prefire - О Prefire библиотеке.
#screencat — dev‑серия о виртуальном коте для macOS
⭐️ Топ‑3 поста (обновляю раз в месяц)
🎯 Какой iOS‑фреймворк станет номером один? — 3 942 просм.
❄️ Создаем зимнее настроение на SwiftUI — 1 518 просм.
🗂 Делаем Notion из Obsidian — 1 437 просм.
#blog - Размышления, впечатления, обзоры, новости
#tools - О фреймворках, приложениях и прочих тулзах
#ai - Все об ai в Apple разработке (LLM, MLC, Ollama, LLM.swift и тд)
#prefire - О Prefire библиотеке.
#screencat — dev‑серия о виртуальном коте для macOS
⭐️ Топ‑3 поста (обновляю раз в месяц)
🎯 Какой iOS‑фреймворк станет номером один? — 3 942 просм.
❄️ Создаем зимнее настроение на SwiftUI — 1 518 просм.
🗂 Делаем Notion из Obsidian — 1 437 просм.
Telegram
Prefire iOS
🎯 Какой iOS-фреймворк станет номером один?
Примите участие в голосовании, чтобы вместе создать ТОП iOS-фреймворков 2024 по версии разработчиков!
📋 Что в опросе?
- Выберите фреймворки, которые вы используете каждый день.
- Добавьте свои любимые инструменты…
Примите участие в голосовании, чтобы вместе создать ТОП iOS-фреймворков 2024 по версии разработчиков!
📋 Что в опросе?
- Выберите фреймворки, которые вы используете каждый день.
- Добавьте свои любимые инструменты…
Prefire iOS pinned «🗂 Навигация #blog - Размышления, впечатления, обзоры, новости #tools - О фреймворках, приложениях и прочих тулзах #ai - Все об ai в Apple разработке (LLM, MLC, Ollama, LLM.swift и тд) #prefire - О Prefire библиотеке. #screencat — dev‑серия о виртуальном коте…»
Prefire iOS pinned «🗂 Навигация #blog - Размышления, впечатления, обзоры, новости #tools - О фреймворках, приложениях и прочих тулзах #ai - Все об ai в Apple разработке (LLM, MLC, Ollama, LLM.swift и тд) #prefire - О Prefire библиотеке. #screencat — dev‑серия о виртуальном коте…»
🎨 Как я рисовал пиксельного кота для своего macOS-приложения
Все майские праздники я провёл за одним — рисовал кота. Хотелось, чтобы у него был характер, настроение, и немного магии 🪄
🐾 Что было сложно
Нарисовать — ещё полдела. Главное — потом правильно разбить его на части:
– хвост должен анимироваться отдельно
– зрачки двигаться в сторону курсора
– и даже поза во сне — отдельный спрайт
🛠 Как я оживил его
Перенёс всё в приложение с помощью своего простого движка анимаций на SpriteKit. Там всё кадрами — как в классике.
Пример кода тоже покажу — вдруг кому-то пригодится!
👇 Вот часть кода с загрузкой спрайтов.
Дальше расскажу как анимировал кота с помощью небольшого собственного движка 💪
#screencat #spritekit
Все майские праздники я провёл за одним — рисовал кота. Хотелось, чтобы у него был характер, настроение, и немного магии 🪄
🐾 Что было сложно
Нарисовать — ещё полдела. Главное — потом правильно разбить его на части:
– хвост должен анимироваться отдельно
– зрачки двигаться в сторону курсора
– и даже поза во сне — отдельный спрайт
🛠 Как я оживил его
Перенёс всё в приложение с помощью своего простого движка анимаций на SpriteKit. Там всё кадрами — как в классике.
Пример кода тоже покажу — вдруг кому-то пригодится!
👇 Вот часть кода с загрузкой спрайтов.
final class CatLayeredView: SKScene {
let body = SKSpriteNode(imageNamed: CatMind.shared.currentSkin.imageName + "_body")
let head = SKSpriteNode(imageNamed: CatMind.shared.currentSkin.imageName + "_head")
let tail = SKSpriteNode(imageNamed: CatMind.shared.currentSkin.imageName + "_tail")
let eyes = EyesNode()
static var defaultScale: CGFloat {
CatConfig.size.width / 1024 * 10
}
private var animator: CatLayeredAnimator!
override func didMove(to view: SKView) {
super.didMove(to: view)
backgroundColor = .clear
anchorPoint = CGPoint(x: 0.5, y: 0.5)
setupLayers()
animator = CatLayeredAnimator(view: self)
animator.setPose(.init())
}
func setPose(_ pose: CatViewAppearance) {
animator.setPose(pose)
}
#screencat #spritekit
This media is not supported in your browser
VIEW IN TELEGRAM
🎞 Как я сделал анимации пиксельного кота на macOS (SpriteKit + свой движок)
В этом видео кот дышит, моргает, двигает хвостом, следит за курсором и спит. Всё это работает на базе моего простого и удобного движка анимаций.
🧠 Идея
Каждое настроение кота (сон, бодрствование, наблюдение) — это набор анимационных эффектов, каждый из которых независим и легко настраивается.
🎛 Система сделана так, чтобы было просто управлять поведением и позой.
🧩 Как устроен движок
Каждый эффект реализует простой протокол:
Аниматор подключает нужные эффекты в зависимости от "настроения" кота:
🎬 Эффекты могут быть какими угодно. Вот, например, как двигается хвост:
В этом видео кот дышит, моргает, двигает хвостом, следит за курсором и спит. Всё это работает на базе моего простого и удобного движка анимаций.
🧠 Идея
Каждое настроение кота (сон, бодрствование, наблюдение) — это набор анимационных эффектов, каждый из которых независим и легко настраивается.
🎛 Система сделана так, чтобы было просто управлять поведением и позой.
case .walking: // Анимации для состояния ходьбы
addEffect(BlinkEffect()) // Моргание глаз
addEffect(EyeWanderEffect()) // Наблюдение за рандомной точкой
addEffect(BreatheEffect()) // Дыхание
addEffect(TailWagEffect()) // Движение хвостом
🧩 Как устроен движок
Каждый эффект реализует простой протокол:
protocol CatAnimationEffect {
func apply(to view: CatLayeredView)
func remove(from view: CatLayeredView)
}
Аниматор подключает нужные эффекты в зависимости от "настроения" кота:
animator.setPose(.sleeping)
// → добавит BreatheEffect, HideEyesEffect, LyingEffect
🎬 Эффекты могут быть какими угодно. Вот, например, как двигается хвост:
final class TailWagEffect: CatAnimationEffect {
func apply(to view: CatLayeredView) {
let wag = SKAction.sequence([
.rotate(byAngle: 0.2, duration: 1.3),
.rotate(byAngle: -0.4, duration: 1.3),
.rotate(byAngle: 0.2, duration: 1.3)
])
view.tail.run(.repeatForever(wag), withKey: "tail_wag")
}
func remove(from view: CatLayeredView) {
view.tail.removeAction(forKey: "tail_wag")
}
}
🎉 Розыгрыш билета на AppsConf 2025!
Хочешь попасть на топовую оффлайн-конференцию для iOS- и Android-разработчиков?
Мы дарим 1 билет на AppsConf 2025, которая пройдёт 4 июня в Москве!
Что будет:
– Сотни мобайл-разработчиков, живое общение и атмосфера большого ивента.
– Я тоже буду на конференции — и веду сразу два круглых стола:
• по AI в разработке
• по плюсам и минусам Open Source
Как участвовать:
1. Подпишись на этот канал.
2. Нажми кнопку «Участвовать» под этим постом.
И всё. Удача может быть на твоей стороне!
🗓 Итоги — 13 мая в 12:00 по МСК. Победителя выберем случайно среди подписчиков.
Хочешь попасть на топовую оффлайн-конференцию для iOS- и Android-разработчиков?
Мы дарим 1 билет на AppsConf 2025, которая пройдёт 4 июня в Москве!
Что будет:
– Сотни мобайл-разработчиков, живое общение и атмосфера большого ивента.
– Я тоже буду на конференции — и веду сразу два круглых стола:
• по AI в разработке
• по плюсам и минусам Open Source
Как участвовать:
1. Подпишись на этот канал.
2. Нажми кнопку «Участвовать» под этим постом.
И всё. Удача может быть на твоей стороне!
🗓 Итоги — 13 мая в 12:00 по МСК. Победителя выберем случайно среди подписчиков.
🚀 Мой путь в мобильной разработке и Open Source
Я поделился на Хабре своей историей о том, как пришёл в мобильную разработку и какие уроки извлёк из участия в Open Source. От первых шагов с хакинтошем до руководства командой в Okko, от создания собственных библиотек до осознания важности оформления проектов и взаимодействия с сообществом.
📖 Читайте полную статью на Хабре: https://habr.com/ru/companies/oleg-bunin/articles/906952/
Я поделился на Хабре своей историей о том, как пришёл в мобильную разработку и какие уроки извлёк из участия в Open Source. От первых шагов с хакинтошем до руководства командой в Okko, от создания собственных библиотек до осознания важности оформления проектов и взаимодействия с сообществом.
📖 Читайте полную статью на Хабре: https://habr.com/ru/companies/oleg-bunin/articles/906952/
Хабр
Дивный мир мобильной разработки и трудности Open Source
Когда я впервые решил создать свой open-source проект, мне казалось, что главное – это хорошая идея и рабочий код. Я взялся за разработку библиотеки для сетевых клиентов и UI-компонентов, вложил в неё...
This media is not supported in your browser
VIEW IN TELEGRAM
🍏 Виджеты в iOS умеют анимации. Но не должны.
Нашёл офигенное видео:
Apple’s Widget Backdoor
Что внутри:
👉 clockHandRotationEffect — приватное API из старых SDK. Позволяет анимировать стрелки в SwiftUI. Да, даже в виджете.
В Xcode 14 это уже выпилили, но можно собрать в Xcode 13 и притянуть как статическую либу.
👉 BlinkingView — вот это настоящая черная магия.
Используется кастомный bitmap-шрифт, где каждый символ — это PNG-кадр.
Виджет показывает Text("A"), потом Text("B"), потом Text("C")…
Каждая буква = кадр анимации. Получается плавная картинка без приватного API, и всё официально.
👉 WidgetAnimation — репозиторий с примером анимированного виджета.
Создаёт 30-секундную зацикленную анимацию в iOS-виджете, используя только публичные API.
Пример работает на 8 FPS, но можно достичь до 30 FPS, используя ту же технику.
Если любишь ломать iOS аккуратно и красиво — must-watch.
App Review пока спит. Но ты не спи.
И вот исходники:
github.com/brycebostwick/WidgetAnimation
Нашёл офигенное видео:
Apple’s Widget Backdoor
Что внутри:
👉 clockHandRotationEffect — приватное API из старых SDK. Позволяет анимировать стрелки в SwiftUI. Да, даже в виджете.
Image(systemName: "clock")
.clockHandRotationEffect(.hours, angle: .degrees(90))
В Xcode 14 это уже выпилили, но можно собрать в Xcode 13 и притянуть как статическую либу.
👉 BlinkingView — вот это настоящая черная магия.
Используется кастомный bitmap-шрифт, где каждый символ — это PNG-кадр.
Виджет показывает Text("A"), потом Text("B"), потом Text("C")…
Каждая буква = кадр анимации. Получается плавная картинка без приватного API, и всё официально.
👉 WidgetAnimation — репозиторий с примером анимированного виджета.
Создаёт 30-секундную зацикленную анимацию в iOS-виджете, используя только публичные API.
Пример работает на 8 FPS, но можно достичь до 30 FPS, используя ту же технику.
Если любишь ломать iOS аккуратно и красиво — must-watch.
App Review пока спит. Но ты не спи.
И вот исходники:
github.com/brycebostwick/WidgetAnimation
Prefire iOS
🎉 Розыгрыш билета на AppsConf 2025! Хочешь попасть на топовую оффлайн-конференцию для iOS- и Android-разработчиков? Мы дарим 1 билет на AppsConf 2025, которая пройдёт 4 июня в Москве! Что будет: – Сотни мобайл-разработчиков, живое общение и атмосфера большого…
Please open Telegram to view this post
VIEW IN TELEGRAM