Никита Бойко
Все кейсы
Планирование задач~25 проектов под контролем

Планировщик, который считает день в часах и помнит, кого вы ждёте

Планировщик под заказ для руководителя ~25 проектов: день — в часах, перегруз виден до его начала, а данные остаются на устройстве

Планировщик, который считает день в часах и помнит, кого вы ждёте

Коротко о проекте

Для кого
Руководитель ~25 параллельных проектов, которому перестало хватать обычного списка задач. Продукт личный: заказчик и единственный пользователь — один человек.
Кто делал
Владелец продукта — сам заказчик: требования и решения его. Код писался в паре с Claude Code, ИИ-агентом для программирования.
Задача
Показывать, влезают ли задачи дня в доступные часы, не давать работе съедать личное время и следить, что другие люди ещё должны.
Что получилось
Приложение для компьютера и телефона: ставится прямо из браузера, задачи хранит на самом устройстве, маленький сервер держит копии в согласии. Старый список задач переехал целиком.
Сроки
26 июня — 24 сентября 2026 года (календарное время).
Масштаб
97 задач, 27 проектов и 55 человек в реальных данных планировщика. 412 автотестов.
Статус
Опытная эксплуатация. Экономию времени пока не измеряли.

Для чего это сделано

Польза простая: перегруженный день видно до того, как он начался. Заказчик ведёт ~25 проектов одновременно, и обычный список задач такого не умел — в этом и были две его беды.

Главная — его же словами: «набрал на день больше, чем физически влезает, и не заметил». В старом планировщике почти у каждой задачи была дата, но не было длительности, так что перегруженный день выглядел как любой другой. Пока не заканчивался😅

Вторая проблема тише: работа незаметно съедала личное время.

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

Что показал старый список задач

Функции выбирали не по списку «как у всех», а по данным. Анализ выгрузки из старого планировщика нашёл три закономерности:

  • 39 тегов были фамилиями. По сути, теги вели учёт того, от кого зависит задача.
  • Цепочки согласований. Прежде чем закрыться, задача проходила через несколько сторон — например, через юристов, а потом через заказчика.
  • 198 из 200 задач стояли «на весь день». Дата есть, а сколько задача займёт — нигде не сказано.

Это и задало ядро продукта: оценки в часах, дневные нормы и список того, что должны другие. Теги, канбан-доски и таймер помодоро сознательно не делали.

Сама выгрузка стала и способом переезда: импорт превратил теги-фамилии в людей и ожидания, а правила повторения — в повторяющиеся задачи.

Функции выбраны по данным, а не по чек-листу

Что показывает планировщик

Все скриншоты — настоящее приложение, запущенное локально на демо-данных: названия проектов и фамилии заменены. Интерфейс русский.

«Сегодня»: влезает ли план?

Экран «Сегодня» с пронумерованными пояснениями

День открывается двумя вердиктами: для работы и для личного времени. Каждый сравнивает запланированные часы с нормой дня и показывает остаток — например, «4 ч 40 мин свободно» из пятичасовой рабочей нормы.

Ряд ячеек, по одной на каждый час нормы, заполняется по мере планирования. А две детали не дают неполному или перегруженному плану спрятаться:

  • Просрочка всё равно считается. Она свёрнута в один блок, но её минуты входят в загрузку дня.
  • Отсутствие оценок видно. Карточка показывает, сколько задач ещё без оценки, и даёт ссылку «оценить». Если в рабочей или личной части дня есть задачи, но ни одна не оценена, вместо числа стоит знак вопроса.

«Разобрать»: четыре вопроса к каждой задаче

Мастер «Разобрать», шаг 4: оценка в часах

Новые задачи не обязательно разбирать сразу. Кнопка «Разобрать» показывает, сколько их ждёт, а короткий мастер проводит каждую через четыре шага: проект, приоритет, срок и оценка в часах.

Последний шаг экран сам называет основой контроля загрузки.

«Я жду»: у кого мяч

Экран «Я жду» с группировкой по людям

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

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

«Загрузка»: дни вперёд

Экран «Загрузка»: дни в часах против двух норм

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

На телефоне

То же приложение ставится на iPhone прямо из браузера, кнопки подогнаны под палец. Тот же день и те же данные, что на ноутбуке, — отдельный список вести не нужно.

Как им пользуются каждый день

Планировщик в опытной эксплуатации у самого заказчика. Ежедневный цикл короткий: записать задачу в Inbox или сразу в «Сегодня» → разобрать → проверить два вердикта дня → дожать тех, кого ждёте, через «Я жду» → посмотреть в «Загрузке» ближайшие дни.

Сколько времени это экономит, честно, пока не измеряли.

Цифры и стоимость

Проект в цифрах

Эксплуатация. Приложение работает в браузере и на телефоне, а единственный сервер — небольшой сервис синхронизации на арендованном сервере. Данных о стоимости эксплуатации нет.

Похожее под ваш процесс. Стоимость согласуем после короткого брифа.

Как это устроено

Синхронизация между ноутбуком, телефоном и небольшим сервером

Само приложение — это экраны «Сегодня», «Завтра», «Неделя», «Загрузка», «Я жду», «Люди», «Все задачи», Inbox и списки плюс мастер «Разобрать».

Данные живут на устройстве

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

Простым это делают три решения:

  • Слияние на устройстве. При синхронизации приложение объединяет свою копию с серверной запись за записью, и побеждает более свежее изменение (у каждой записи есть время правки, updatedAt).
  • Маленький сервер. 245 строк и ни одного стороннего пакета, так что обновлять и проверять чужой код не нужно.
  • Атомарная запись. Сохранение либо проходит целиком, либо не происходит вовсе, поэтому прерванная запись не оставит недописанный файл.

У слияния есть цена. Если одну задачу поправили и на телефоне, и на ноутбуке до синхронизации, целиком сохранится более поздняя версия, а правки с другого устройства в этой задаче перезапишутся. Для одного человека, который ходит между ноутбуком и телефоном, это просто и предсказуемо.

Доступ к хранилищу спрятан за интерфейсами репозиториев, отдельно от экранов и логики: чтобы переехать с хранилища браузера на другое, достаточно заменить один файл. Перенос накопленных данных был бы отдельным шагом.

Релиз одной командой, откат одной командой

Релиз одной командой, откат одной командой

Релиз — одна команда, которая по порядку делает пять шагов: автотесты, сборку, снимок данных сервера, выкатку на сервер и проверку живой версии. Вторая команда откатывает релиз.

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

Проверяется интерфейс, а не только код

Автотесты проверяют логику, а у интерфейса свои проверки:

  • Скриншотер на headless Edge (браузер без окна) проверяет каждый снимок на три проблемы: горизонтальный скролл, поля меньше 16 px и области нажатия меньше 44 px — распространённый минимум под палец.
  • Аудит ИИ-агентами-скептиками. Агенты, которым велели быть придирчивыми рецензентами, прошлись по интерфейсу и записали ~120 находок в 11 зонах.
  • Редизайн в шесть шагов после аудита, проверенный 449 контрольными скриншотами в трёх размерах экрана и двух темах.
  • Цвета проектов с проверкой различимости. Цвета приглушены, а тест измеряет ΔE — стандартную меру того, насколько по-разному выглядят два цвета, — чтобы соседние проекты не сливались.

Разработка: 26 июня — 24 сентября 2026 года

Дата Что происходило
26 июня Начало разработки.
16 августа Бриф аудита интерфейса ИИ-агентами, затем редизайн в шесть шагов.
24 сентября Конец периода, описанного в кейсе. Дальше — опытная эксплуатация.

Кому это подойдёт

  • Руководителям проектов и команд, которые ведут много проектов сразу и большую часть недели ждут чужих согласований.
  • Консультантам, агентствам и фрилансерам, которые продают своё время и хотят знать, есть ли в неделе место, прежде чем сказать «да».
  • Тем, кто уходит с готового сервиса и хочет планировщик под свой реальный процесс, с переносом задач.
  • Компаниям, которые хотят держать данные планирования на своём сервере, а не в стороннем сервисе. Эта сборка рассчитана на одного владельца; командные аккаунты и роли обсуждаются отдельно.
Технические подробности

Технические детали

Архитектура

  • Слияние на клиенте по записям: побеждает более свежий updatedAt, запись заменяется целиком.
  • Скрипт релиза: тесты → сборка → снимок данных → выкатка → проверка, откат одной командой.
  • Импорт из TickTick: теги-фамилии → люди и ожидания, RRULE → повторяющиеся задачи.

Качество и тесты

  • 412 автотестов (Vitest и Testing Library), на момент последнего подсчёта все зелёные; компилятор TypeScript (tsc) ошибок не выдаёт.
  • 5 738 строк тестов в 44 файлах; само приложение — 11 575 строк TS/TSX без тестов.

Данные и приватность

  • Данные планирования хранятся в браузере на устройствах заказчика и синхронизируются по токену с его собственным VPS.
  • Скриншоты в кейсе сняты на демо-данных, названия проектов и фамилии заменены.

Технологии

Слой Технологии
Приложение Одностраничное приложение: React 18, TypeScript, Vite 5; PWA через vite-plugin-pwa
Данные на устройстве localStorage за интерфейсами репозиториев
Сервер синхронизации Встроенный модуль http в Node.js, 245 строк; JSON с атомарной записью; без npm-зависимостей
Хостинг VPS, systemd
Тесты Vitest, Testing Library, компилятор TypeScript (tsc)
Проверки интерфейса Свой скриншотер на headless Microsoft Edge
Разработка Claude Code (ИИ-агент для программирования)

Хотите что-то похожее?

Расскажите о своей задаче, и я вернусь с планом: что сделаем, за какой срок и как поймём, что сработало.

Обсудить проект
Связаться