«Сферы»: как автор создала офлайн-планировщик для разных областей жизни

Автор приложения «Сферы» столкнулась с проблемой, знакомой многим людям, которые легко погружаются в один проект. Во время гиперфиксации все внимание уходит на рабочую или личную задачу, а бытовые дела, здоровье и другие важные области жизни остаются без контроля. Когда фокус наконец переключается, обнаруживается накопившийся список нерешённых вопросов.
Готовые планировщики не закрывали эту потребность. В Todoist можно распределять задачи по проектам, назначать приоритеты и настраивать фильтры. TickTick объединяет задачи, календарь и трекер привычек, а SingularityApp предлагает разные представления одного проекта — список, календарь, канбан-доску или диаграмму Ганта. Однако во всех этих сервисах сферы жизни нужно создавать и организовывать самостоятельно. Поэтому автор решила сделать приложение, в котором такие области уже являются частью интерфейса.
От личной проблемы к структуре приложения
Рабочая гипотеза проекта звучала так: если постоянно видеть разные сферы жизни, превращать цели в конкретные действия и назначать им время, выбирать приоритет на сегодня будет проще. На её основе появились четыре основных экрана. «Сферы» показывают, что происходит в разных областях, «Цели» помогают определить желаемый результат и первый шаг, «Планер» связывает задачи со временем, а раздел «Сегодня» оставляет только ближайшие дела.
Для первой версии автор выбрала повседневные сценарии: создать задачу, найти её через несколько дней, переименовать, назначить дату и время, получить уведомление, а затем выключить или отложить напоминание. Важными условиями стали работа без регистрации и возможность открыть план без подключения к интернету.
Карточки сфер и путь от цели к действию
Главный экран построен в виде сетки карточек. У каждой сферы есть название, значок и цвет, а крупное число показывает количество записанных дел. Дополнительная подпись уточняет контекст: например, в разделе «Работа» может быть задача на сегодня, а в «Учёбе» — дело, которое запланировано на другой день. При этом пустые карточки не исчезают: ноль задач в разделе «Здоровье» не означает оценку состояния человека, а лишь показывает, что в приложении пока ничего не записано.
В поиске отображается контекст родительских разделов и путь к найденной записи. Обзор вложенного раздела собирает дочерние задачи, но при открытии переводит пользователя к исходному делу. Это помогает сохранять иерархию и находить старые записи, в названии которых не было полного описания задачи.
Карточка цели хранит не только формулировку результата, но и ответ на вопрос, зачем он нужен. В ней можно указать причину, срок, этапы и возможное препятствие. Блок «Если станет трудно» предлагает заранее сформулировать действие для сложной ситуации: например, если вечером не захочется читать целую главу, прочитать хотя бы две страницы. Автор связывает такую механику с подходом implementation intentions, который изучали Питер Голлвитцер и Вероника Брандштеттер. При этом эффект самого приложения на пользователях отдельно не измерялся.
Предполагаемый сценарий выглядит так: пользователь открывает сферу «Дом», создаёт цель «Разобрать вещи перед переездом», добавляет этап «Разобрать один ящик» и выделяет на него 15 минут в воскресенье. Большая цель остаётся в своём разделе, а в дневном плане появляется выполнимое действие.
Планирование времени и Android-будильник
В «Сферах» задача может иметь точное время или быть привязанной только к определённому дню. Это позволяет отличать прогулку в 21:30 от дела, которое нужно выполнить в воскресенье, но пока не имеет конкретного часа. Раздел «Сегодня» сокращает обзор до ближайших задач, а недельный план показывает общую загрузку.
Напоминания связаны с конкретной задачей и её расписанием. Логика приложения рассчитывает время сигналов, учитывает настройку «напомнить заранее» и пропускает выполненные дела. Для задачи на 18:00 с уведомлением за 15 минут могут быть запланированы сигналы на 17:45 и 18:00. Android-модуль на Kotlin использует AlarmManager.setAlarmClock, если системе разрешены точные будильники. При отсутствии такого доступа применяется setAndAllowWhileIdle, у которого время доставки менее предсказуемо.
После аудита обработку команд будильника разделили между закрытым AlarmReceiver и отдельным BootReceiver, который восстанавливает расписание после системных событий. Благодаря этому кнопки уведомлений продолжают работать через системный PendingIntent, а внешнее приложение не может напрямую отправить команду внутреннему обработчику.
Разработка с ИИ-ассистентом и проверка первой версии
Работа над приложением шла короткими итерациями. Автор описывала ассистенту желаемое поведение и конкретные ошибки, а затем вместе с ним превращала проблемы в проверяемые сценарии. ИИ помогал читать код, искать причины неисправностей, вносить изменения, готовить проверки и собирать APK. Решения о функциях и проверку сценариев на реальном телефоне автор оставляла за собой.
Один из циклов касался переименования задачи. Выяснилось, что при изменении заголовка и немедленном нажатии «Сделано» обработчик мог использовать предыдущее значение поля. Исправление заставило приложение читать актуальный черновик и одной операцией сохранять новое название вместе со статусом выполнения. Затем проверили повторное открытие карточки и возврат с экрана.
Для интерфейса проводили пробный аудит на вымышленных данных. Сценарии включали первый запуск, поиск семейного дела и просмотр прогресса цели. Так обнаружились смешение учебных и личных записей, а также слишком длинный путь к вложенной задаче. Эти проверки помогли определить места для дальнейшей работы, но удобство приложения для реальных новичков ещё предстоит оценить отдельно.
Отдельно автор изучала идею облачного наставника. На 18 сценариях, с двумя повторами и четырьмя конфигурациями моделей, получили 144 результата. Проверялось, умеют ли модели выдавать структурированный ответ, различать дату и срок и задавать уточняющий вопрос при неоднозначности. Практический вывод оказался таким: сортировку простых дел можно оставить локальной, а диалог с наставником рассматривать как отдельную облачную функцию с собственными проверками, квотами и расходами.
Почему приложение начали с офлайн-версии
В первую версию вошли функции, которыми автор хотела пользоваться ежедневно: сферы, цели, задачи, планер, поиск, повторы и будильник. Beta работает без регистрации, а облачный наставник и синхронизация запланированы для полной версии. Интерфейс создан на React Native с Expo и TypeScript, навигация реализована через Expo Router, состояние хранится с помощью Zustand, а Android-будильник вынесен в нативный модуль.
Данные Beta сохраняются на устройстве. При смене телефона потребуется экспортировать резервную копию и восстановить её вручную. Поэтому приложение проверяет поддерживаемые старые форматы, валидирует содержимое до применения и исключает секретные поля из экспорта. Перед релизом также проверяли сохранность данных после перезапуска и обновления APK.
В отчёте по «Сферы Beta» 1.0.6 указано 217 пройденных регрессионных тестов. На чистом эмуляторе Android 16 установили подписанный APK, проверили основные экраны в авиарежиме, создание русскоязычных задач и цели, поиск и переименование дела, сохранение после принудительного завершения и обновления приложения. Для будильника подтвердили появление локального уведомления и его отключение кнопкой «Выключить».
Раннюю сборку дополнительно проверяли на смартфоне Huawei: открывали разделы, находили существующую задачу и подтверждали, что сигнал слышен. Финальную Beta тестировали на эмуляторе с выключенным звуком, поэтому длительную работу в фоне и восстановление сигнала после перезагрузки Huawei в этом прогоне не проверяли.
Первое приложение получилось инструментом, созданным вокруг конкретной потребности: видеть рядом работу, дом и здоровье, не терять большую цель среди текущих задач и получать напоминание в момент, который был выбран заранее. Автор довела проект до состояния, в котором его можно установить на телефон и использовать для настоящих дел, а дальнейшее развитие будет зависеть от проверки сценариев на живых пользователях.


