Я разработал приложение, которое помогает найти главную цель в жизни, и оно лежит в App Store. Вот где я ошибся
КодингПридумал и собрал приложение, получил отказ от Apple, слил в репозиторий приватный ключ Google и пять месяцев держал новую версию приложения на ноутбуке. Теперь в App Store есть SevenGoals. Теперь я знаю, как избежать этих ошибок.
Как родилась идея SevenGoals
У Брайана Трейси есть упражнение «10 целей». Каждое утро ты записываешь в тетрадь десять актуальных в моменте целей. Но не заглядывая во вчерашний список.
Суть в том, что 10 целей не получится запомнить и переписывать каждый день. Важное всплывает снова и снова, случайное отваливается. Через месяц видно, какие цели твои, а какие ты писал «до кучи».
Я решил поднять такое в своём айфоне.
Первая версия называлась MainGoal. Десять полей для целей, регистрация, календарь с отмеченными днями и экран со всеми целями. Первые записи появились в декабре 2025 года.
Работает — не значит полезно
В январе я инспектировал приложение, сравнил свой интерфейс с Duolingo, Todoist и Headspace.
Составил 25 пунктов косяков. Нельзя было восстановить пароль, удалить аккаунт — а без этого сторы не пускают. Нет политики конфиденциальности. Телефон не вибрирует при добавлении цели. Клавиатура закрывается после каждой строки, и семь целей подряд записать неудобно.
Главный экран занимал 1025 строк в одном файле. После разбора на семь компонентов осталось 263.
Добавил вибрацию, всплывающие сообщения, восстановление пароля, удаление аккаунта и конфетти. Конфетти — это 60 цветных квадратиков: они вылетают вверх, когда записана последняя цель дня.
Почему осталось семь целей, а не десять
Мне показалось, что семь — более красивое число. В середине января я поменял лимит. Вместе с ним поменялось и имя: MainGoal стал SevenGoals.
У решения была цена. Дни, когда я записывал десять целей, перестали считаться закрытыми. В коде стояло «ровно 7», а нужно было «7 и больше».
Обоснование пришло позже. У Стивена Кови человек планирует жизнь через 5–7 ролей: родитель, специалист, друг. Семь целей — это по одной цели на роль. Совпало случайно, но сейчас это новая концепция.
Первый урок: не чинить то, что не чинится
В календаре месяцы перелистываются свайпом. Свайп работал через раз. Иногда в январе показывались декабрьские дни.
Менял настройки, ставил задержки в 50 и 100 миллисекунд. Каждая правка ломала что-то ещё.
Оказалось, что обработчик свайпа и кнопки дней борются за одно касание. В React Native это известный конфликт, настройками его не решить. Решила готовая библиотека для перелистывания страниц.
Идея, которую мы отложили
Люди пишут одно и то же разными словами. В понедельник «купить квартиру», во вторник «нужно жильё побольше», в среду «найти свой угол». Это одна цель.
Я хотел, чтобы ИИ собирал такие цели в группы и показывал круговую диаграмму. Открываешь — а там 40% твоих мыслей про жильё.
Прикинул, что нужен платный тариф Firebase, подписка и отдельная проверка Apple. И вопрос приватности: цели — личное, а их пришлось бы отправлять на чужой сервер.
Решил так: сначала выпускаем бесплатное приложение, платное добавляем потом. Первая проверка в сторе проще, если в приложении нет покупок.
Два магазина, два разных препятствия
Google Play одобрил аккаунт разработчика сразу. Но там, прежде чем опубликовать приложение для всех, его 14 дней должны тестировать минимум 12 человек.
У меня не нашлось 12 знакомых с Android. Android-версия до сих пор во внутреннем тестировании.
И первая же тестовая сборка не запустилась по-настоящему. Ты пролистываешь три экрана приветствия, нажимаешь «Начать» — и попадаешь на первый экран приветствия. В приложение не попасть. Напоминание на 21:00 приходило сразу после запуска.
С Apple вышло наоборот. Аккаунт проверяли долго. Имя SevenGoals оказалось занято, пришлось стать «SevenGoals — Daily Tracker».
3 марта пришёл отказ. Ревьюер Apple не смог войти в демо-аккаунт. Логин я указал в анкете, а сам аккаунт в базе создать забыл. Исправление — создать аккаунт и отправить приложение заново.
В марте версия 1.0 появилась в App Store.
Я сам перестал открывать своё приложение
Утром я записывал семь целей, смотрел на конфетти и закрывал приложение до следующего утра. Иногда и утром забывал: напоминания не работали.
Получалось, что цели живут отдельно от дня. Записал «здоровье» — и ничего для него не сделал.
Решение предложила жена. Она хотела утром писать глобальные цели, а под каждой — дела на сегодня. Выполнил — поставил галочку.
Риск был понятен: превратиться в ещё один список дел. Но здесь дела рождаются из цели, а не из входящих. Сначала «зачем», потом «что».
Я переименовал задачи в шаги: к цели идут шагами. И добавил два напоминания: в 8:00 записать цели, в 21:00 отметить сделанное. Расчёт на то, что приложение будут открывать не один раз в день, а три-пять.
Довольно долго пилил интерфейс. Шаг удаляется долгим нажатием, а не свайпом: цель уже свайпается, и два свайпа друг в друге конфликтуют. Поле «Добавить шаг» появляется по нажатию, как в «Напоминаниях» Apple. Подсказка про свайп показывается два раза и исчезает навсегда.
Пять месяцев на одном ноутбуке
Шаги были готовы 20 марта. Потом наступила пауза: работа, другие проекты. Я вернулся к приложению 23 августа.
Проверил на косяки. Первая находка была не в коде. Последний коммит на GitHub датирован 12 марта. Вся работа над шагами — 947 строк — пять месяцев лежала только на моём Mac. Один пролитый кофе, и версии 1.2 не существовало бы.
Ключ в репозитории. В папке проекта лежал приватный ключ Google Cloud для публикации в Google Play. Он ушёл на GitHub вместе с кодом. Репозиторий приватный, но это не считается. Ключ отозвал, новый лежит вне проекта.
Удаление аккаунта уничтожало данные зря. Приложение сначала стирало историю целей, а потом спрашивало пароль. Передумал и нажал «Отмена» — аккаунт на месте, истории нет. А если в истории больше 500 дней, аккаунт не удалился бы вообще: у Firestore лимит 500 операций за раз.
Пропадающие галочки. Отметил два шага подряд — в базу мог попасть только один. На экране галочки стояли, после перезапуска одна исчезала. Именно так шаги и отмечают — пачкой вечером.
Полночь. Приложение открыто в 23:58, галочка в 00:01. Запись уходила в новый день, которого ещё нет, и экран внезапно пустел.
Переход на летнее время. Серия дней подряд считалась в часах. В день перевода часов в сутках 23 или 25 часов — и серия обрывалась на ровном месте. Дважды в год у всех.
Плюс мелочи: нет защиты от «белого экрана», Android-конфиг от старого имени MainGoal, девять мёртвых файлов. И незаполненная анкета Евросоюза для разработчиков: без неё Apple убирает приложение из европейского App Store.
Ни одна из этих ошибок не была видна при обычном использовании. Все срабатывают на границах: полночь, смена времени, быстрые нажатия, длинная история.
Релиз 1.2
Исправления разбил на блоки по принципу «что сейчас мешает юзерам» и «что грозит в перспективе». 30 августа версия 1.2 появилась в App Store. В ней шаги внутри целей, напоминания утром и вечером и все исправления из аудита.
Что я сделал бы иначе
Коммитил бы каждый день. Закончил функцию — коммит и пуш.
Сразу записал бы всё окружение в инструкцию. Чтобы не вспоминать каждый раз, что и где поднял.
Идея ИИ-сортировщика вернулась в новом виде. В январе я упёрся в вопрос: «купить квартиру» и «найти свой угол» — это одно или разное? ИИ решал бы за человека.
Роли по Кови снимают этот вопрос. Человек один раз задаёт свои роли, а ИИ только раскладывает по ним цели. С ярлыком, который придумал сам.
План такой: сначала воскресный экран «Итоги недели» на текущих данных. Если его будут открывать — добавляем роли. Если нет — узнаем это за вечер работы, а не за месяц.
А ещё нужны 12 человек с Android. Если вы из них — напишите мне в Telegram.
SevenGoals бесплатный: SevenGoals — Daily Tracker в App Store.