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

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

День открывается двумя вердиктами: для работы и для личного времени. Каждый сравнивает запланированные часы с нормой дня и показывает остаток — например, «4 ч 40 мин свободно» из пятичасовой рабочей нормы.
Ряд ячеек, по одной на каждый час нормы, заполняется по мере планирования. А две детали не дают неполному или перегруженному плану спрятаться:
- Просрочка всё равно считается. Она свёрнута в один блок, но её минуты входят в загрузку дня.
- Отсутствие оценок видно. Карточка показывает, сколько задач ещё без оценки, и даёт ссылку «оценить». Если в рабочей или личной части дня есть задачи, но ни одна не оценена, вместо числа стоит знак вопроса.
«Разобрать»: четыре вопроса к каждой задаче

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

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

Тот же вердикт, только на ближайшие дни: перегруженный день видно заранее. Задачи без оценки помечены и здесь, чтобы дыру в плане не приняли за свободное время.
На телефоне
То же приложение ставится на 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 (ИИ-агент для программирования) |