Як ми створили застосунок Aimgod для iPhone з Claude

Aimgod це мій власний продукт, спокійний планувальник дня, яким я щодня користуюся вже багато років. На початку жовтня ми створили його нативний застосунок для iPhone: десять збірок у TestFlight за чотири дні, написаних на SwiftUI з Claude Code і протестованих на моєму власному телефоні. Розповідаю, як розподілили роботу, як я керую Claude, за чим стежив AI і що пішло не так.
Чому нативно і чому зараз
Веб-застосунок Aimgod уже працював на телефоні, і його можна було встановити з браузера. А потім один із тестувальників сказав те, з чим я не міг посперечатися: планувальник, що живе у вкладці браузера, сприймається менш серйозно, ніж застосунок. Коли йдеться про щось настільки особисте, як ваш день, довіра важлива. А ще я помітив, що близько 80% часу користуюся Aimgod на iPhone.
Тож ми обійшлися без обгортки і одразу пішли в SwiftUI. Веб-сторінка всередині оболонки застосунку вийшла б швидше, але ніколи не відчувалася б своєю на телефоні і не дала б нам віджетів, Live Activities у Dynamic Island чи справжнього тактильного відгуку.

Як розподілена робота
Приблизно 70% роботи досі становить ремесло: ідея продукту, сценарії, інтерфейс, анімація, рішення про те, що йде в першу версію, а що почекає. Ця частина йде від мене і від дизайн-системи, яку я зібрав у Figma.
На решті 30% AI змінює економіку. Claude Code пише Swift, тримає iOS-застосунок синхронним із веб-застосунком, систематизує токени і специфікації, пише тести і завантажує збірки. Я не пишу Swift вручну. Я описую, перевіряю і тестую.
Налаштування просте. Xcode працює на Mac mini і підключений до Claude Code через MCP, тож Claude сам збирає проєкт, запускає симулятор і читає помилки. Веб-застосунок є джерелом істини: специфікація відповідності перелічує кожен екран, стан і анімацію мобільної веб-версії, і нативний застосунок має збігатися з нею, перш ніж отримає щось нове.

Як я працюю з Claude щодня
Усе починається з дизайн-системи. Або вона вже є, або є дизайн-файл, і спершу ми перетворюємо його на систему: токени, типографіка, кольори, компоненти, стани. Лише потім із неї збираються екрани і сторінки, у застосунку і на сайті. Тому результат виглядає спроєктованим, а не згенерованим.
Я веду роботу з двох місць одночасно. На комп’ютері дивлюся на збірку, симулятор чи сторінку. На телефоні даю команди голосом, перевіряю результат на реальному пристрої і надсилаю наступну правку, поки Claude ще працює над попередньою. Більшість моїх інструкцій усні, короткі й візуальні: посунь це, зроби те світлішим, ця анімація зупиняється надто різко.
Правки мої, і в цьому головна відмінність від AI, який збирає щось за промптом. Модель може видати робочий екран. Але вона не скаже, що стрілка в кнопці-пігулці виглядає зміщеною від центру, що сірий на один тон засвітлий для дрібного тексту чи що перехід здається нервовим. Для цього потрібне натреноване око, і це око лишається за дизайнером.
Усе інше, що можна автоматизувати, автоматизовано: збірки, завантаження в TestFlight, тести, скриншоти, перевірки на відповідність гайдлайнам, журнал проєкту. Мої основні інструменти лишаються тими самими: Figma, Adobe After Effects і Webflow, а для AI-відеофонів у моїх роботах Artlist. Claude працює поверх них і знімає рутину.
За чим стежив Claude
Відповідність вебу. Кожна анімація має прописану криву і тривалість. Підзадачі відкриваються за 600 мс по тій самій кривій, що й у вебі, пігулка часу під час закриття згортається праворуч, а не до центру. Claude записує веб-версію на ширині 390 px і симулятор, розкладає обидва записи на кадри і порівнює початок, напрямок, точку прив’язки і кінцевий стан.

Правила Apple раніше за рецензентів Apple. Перш ніж щось подавати, ми перевіряли збірку за тими пунктами App Store Review Guidelines, через які застосунки відхиляють найчастіше:
- AI-асистент перед першим запитом показує екран згоди з посиланням на політику конфіденційності, а згоду можна відкликати в налаштуваннях;
- підписка, яку продають на сайті, може з’явитися в застосунку, лише якщо її можна купити і там через вбудовану покупку, тому версія 2.0 виходить тільки з безкоштовними функціями, а Premium з’явиться разом із вбудованими покупками у версії 2.1;
- жодних заглушок для неготових функцій, бо рецензенти відхиляють екрани «скоро буде»;
- видалення акаунта працює всередині застосунку, включно з відкликанням токена Sign in with Apple.
Доступність. Автоматичний аудит кожного основного екрана, найбільший розмір Dynamic Type, підписи VoiceOver, Reduce Motion, контраст в обох темах і зони дотику щонайменше 44 пункти. Кілька дрібних сірих текстів і непомітних посилань не пройшли перевірку, їх виправили.
Надійність. Режим польоту і синхронізація без дублікатів, повільна мережа, застосунок, примусово закритий посеред синхронізації, день із сорока задачами, зміна часового поясу опівночі.
Як я тестую
Я цільовий користувач, тож і тестувальник номер один. Кожна збірка потрапляє в TestFlight і одразу на мій iPhone. Я планую в ній свій реальний день і записую все, що здається неправильним, простими словами: «підзадачі стрибають, коли швидко натискаю», «час блимає, коли пігулка закривається». Кожна нотатка стає пронумерованим пунктом у списку багів, отримує регресійну перевірку і закривається в конкретній збірці. Потім я встановлюю наступну збірку і дивлюся саме на ті пункти, які виправили.
Юніт-тести не впіймали жодного мого зауваження до анімацій. Тому й існує покадрове порівняння, і тому кожну взаємодію проганяють тричі поспіль: більшість багів з’являлися лише з другої чи третьої спроби.
Складні місця
Анімації, що ламаються під час повтору. Підзадачі вперше розгорталися плавно, а далі стрибали через раз, якщо натискати частіше, ніж раз на секунду. Причиною був відкладений колбек, який конфліктував із наступним натисканням. Рішенням стало одне джерело істини для стану «відкрито чи закрито» з анімацією від того місця, де рядки перебувають у цей момент.
Таймер, якого ніхто не розумів. Перша Live Activity показувала в Dynamic Island лічильник, що біжить, ще й шрифтом із засічками. Розширення віджетів не бачить шрифтів застосунку, тому підставляло системний шрифт із засічками. Тепер у Dynamic Island видно знак Aimgod, зворотний відлік часу, що лишився до кінця поточної задачі, і кнопку Done, яка працює без відкриття застосунку.
Деталь шрифту. Inter, шрифт усього застосунку, у табличних цифрах зберігає засічку на одиниці, хоч яку функцію шрифту ввімкнути. У таймері Live Activity, де цифри не повинні стрибати, ми використовуємо системний шрифт лише для чисел.
Маленькі телефони. На iPhone SE під час відкриття підзадач сторінка прокручувалася на 110 пунктів за один кадр. На Pro все гаразд, на найменшому підтримуваному телефоні зламано. Тепер кожна перевірка проходить на обох розмірах.
Голосове введення. AI-асистент падав під час диктування, бо колбек дозволу на розпізнавання мовлення приходив у фоновому потоці, а Swift 6 такого не пробачає. Помилку впіймали і виправили до збірки на рецензію.
Що тестувальники попросили першим
Перші відгуки прийшли з веб-версії. Список задач на десктопі був зверстаний надто великим для повного дня, і люди хотіли компактний вигляд. Його випустили того ж дня. Двоє тестувальників сказали, що їм бракує нативного застосунку: веб-застосунок здавався менш надійним і менш плавним, ніж те, що живе на головному екрані. Так з’явився цей проєкт. Ще одна тестувальниця описала, як мають працювати цілі, і розділ Goals перебудували навколо її ідеї: не список, а картки, які можна перетягувати, з’єднані в шлях. Решта були дрібні технічні виправлення.
Фірмові деталі
Деякі речі мають сенс лише в телефоні. Найбільше я люблю Live Activity, яка з’являється в момент старту задачі, зі зворотним відліком на екрані блокування і в Dynamic Island. Встановлення часу теж має своє відчуття: шкала м’яко клацає під пальцем. Коли ви завершуєте задачу, синхронно з анімацією грає власний тактильний патерн: м’який поштовх, коли палець натискає на кільце, чіткий подвійний, коли з’являється галочка, і короткий висхідний, коли виконано останню задачу дня. Час у Dynamic Island і на екрані блокування подається у форматі Apple, а всередині застосунку в нашому. Свайп між днями рухає лише задачі, шапка лишається на місці.

З чого почнеться наступний
Aimgod почався з вебу, бо нативна розробка коштувала значно дорожче. Тепер це не так. Наш наступний продукт почнеться з телефону, на iOS і Android, і веб-версія вже піде від застосунку, а не навпаки.
Що на це пішло

Чотири дні від порожнього проєкту в Xcode до кандидата на рецензію. Екран дня зі шкалою часу, сферами, підзадачами й описами, вхід через Apple і Google, синхронізація з веб-застосунком у реальному часі, нагадування з дією Done, віджети, Live Activity, AI-асистент із диктуванням, тижневий дашборд продуктивності, скриншоти для App Store і демо-акаунт для рецензентів. Під кінець Claude ще й сам завантажував збірки в TestFlight.
AI не проєктував цей застосунок і не вирішував, що в нього ввійде. Він прибрав відстань між рішенням і робочою збіркою. Саме ця частина колись забирала в команди місяці, і саме її ми тепер приносимо в клієнтські проєкти.
