Персональный local-first таск-трекер на React/TypeScript. Он объединяет быстрый захват задач, Сегодня, проекты, список и доску Входящих, календарь и дедлайны, матрицу Эйзенхауэра, поиск и фильтры, таймер фокуса, привычки, корзину/архив и настраиваемое оформление.
Текущая реализация — браузерный MVP. Она проверяет продуктовые сценарии и адаптеры, но ещё не является Tauri-сборкой для Ubuntu.
Понадобятся Git, Node.js 18.19 или новее и
npm (он устанавливается вместе с Node.js). Проверить версии можно так:
git --version
node --version
npm --version-
Склонируйте репозиторий и перейдите в папку проекта:
git clone https://github.com/S0K0lAN/Tracker.git cd Tracker -
Установите зафиксированные в
package-lock.jsonзависимости:npm ci
-
Запустите сервер разработки:
npm run dev
-
Откройте на компьютере
http://localhost:4173. При первом открытии приложение автоматически загрузит демонстрационные данные.
Чтобы остановить сервер, вернитесь в терминал и нажмите Ctrl+C. При
следующих запусках достаточно выполнить cd Tracker и npm run dev.
npm run build
npm run previewПосле запуска откройте http://localhost:4173.
Dev-сервер слушает локальную сеть. Подключите телефон и компьютер к одному
Wi-Fi и откройте http://<локальный-IP-компьютера>:4173. Текущий локальный
IP можно узнать командой ip -4 -brief address show scope global.
Не пробрасывайте порт 4173 в интернет: это сервер разработки без production- защиты и авторизации.
npm test
npm run build
npm run test:e2eПри первом запуске приложение создаёт воспроизводимый демонстрационный набор: проекты, задачи разных приоритетов и состояний, пересекающиеся временные слоты, многодневные дедлайны, теги, подзадачи, напоминания, вложения и историю привычек. Даты рассчитываются относительно дня запуска.
Если в браузере уже есть локальные данные, откройте «Настройки → Данные» и
нажмите «Сбросить», чтобы загрузить актуальный demo-набор из
src/domain/seed.ts. Существующие локальные изменения при этом будут заменены.
Маршруты: /today, /inbox, /projects, /calendar, /matrix, /search,
/habits, /trash, /settings.
- Создание и редактирование задач с проектом, датами, важностью, вычисляемой срочностью, тегами, напоминаниями, подзадачами и вложениями.
- Отдельный просмотр существующей задачи; редактор и действия запускаются явно.
- Просмотр изображений/PDF/текста, голосовой capture с русским parser и текстовым fallback: обычная дата задаёт начало, «до»/«дедлайн» — дедлайн.
- Проекты, глобальный поиск, сохранённые фильтры и сортировка Входящих.
- Входящие в виде списка или доски с отдельным переходом в календарное планирование.
- Календарь на год, месяц, неделю, три дня и день; периоды листаются кнопками, свайпом или мышью; полный список задач ячейки месяца и диапазонная диаграмма дедлайнов на неделю/месяц/год.
- Мягкое удаление, восстановление, окончательное удаление и отдельный архив.
- Привязанный к задаче 25-минутный таймер фокуса и накопление минут.
- Создание и редактирование привычек с описанием, десятью векторными иконками и индивидуальным ритмом.
- Светлая/тёмная тема, акценты, глобальные семейство/масштаб шрифта, встроенные и пользовательский фон.
- Schema v3, миграция schema v2, localStorage backup/recovery.
- Глубокая проверка импортируемых сущностей и безопасные локальные
data:-URL вложений; повреждённые копии помещаются в quarantine до восстановления. - OAuth-подключение Google Drive, ручная загрузка удалённой копии, автосинхронизация и безопасный выбор версии при конфликте.
- Реестр провайдеров удалённого хранилища: новый адаптер подключается без изменения доменной модели задач, а сохраняемые config-поля обязаны быть явно классифицированы как публичные.
- Unit/component, Playwright E2E, WCAG AA и windowed performance gate на 500 задач.
- Бизнес-требования
- Расширенные функции, данные и ограничения
- Acceptance-матрица и тестовое evidence
- План и правила для агентов-разработчиков
В браузерном MVP реализован OAuth через Google Identity Services и Drive API
v3 с минимальным scope drive.appdata. Приложение умеет найти существующую
копию focus-flow-data.json, загрузить её, создать новую, обновлять после
локальных изменений и обнаруживать изменение удалённой ревизии. При первом
подключении разных копий пользователь явно выбирает источник; перед импортом
локальное состояние сохраняется в отдельный backup.
Drive media upload не документирует атомарный compare-and-swap: приложение
повторно проверяет ID/version непосредственно перед записью и никогда не
разрешает обнаруженный конфликт автоматически, но между проверкой и PATCH
остаётся best-effort окно гонки. Для полной межустройственной гарантии нужны
будущие immutable revisions/base snapshot и трёхсторонний merge.
-
В Google Cloud Console создайте или выберите проект, включите Google Drive API и настройте OAuth consent screen.
-
Создайте credential типа OAuth client ID → Web application. Добавьте точный адрес приложения в Authorized JavaScript origins, например
http://localhost:4173для локальной разработки и открывайте приложение именно по этому адресу: OAuth origin должен совпадать полностью. Для production используйте стабильный HTTPS origin. -
Скопируйте
.env.exampleв.env.localи замените пример публичным Client ID:cp .env.example .env.local
VITE_GOOGLE_CLIENT_ID=000000000000-example.apps.googleusercontent.com
Client secret браузерному приложению не нужен и не должен попадать в
.env.local. -
Перезапустите
npm run dev, откройте «Настройки → Синхронизация», выберите Google Drive и нажмите «Подключить Google Drive».
Client ID также можно ввести непосредственно в настройках; это публичный
идентификатор. Access token существует только в памяти вкладки и исключён из
localStorage и удалённого snapshot. После перезапуска выбранный провайдер,
Client ID, удалённая ревизия и настройка автосинхронизации сохраняются, но
браузер попросит нажать «Продолжить с Google», чтобы получить новый
краткоживущий token. Это ограничение безопасной browser-only OAuth-модели:
полностью фоновое постоянное подключение потребует BFF с защищённым refresh
token либо будущей Tauri-версии с Authorization Code + PKCE и системным secret
store.
OAuth с адреса телефона вида http://192.168.x.x:4173 не следует считать
production-сценарием. Для входа с телефона разверните приложение на HTTPS и
добавьте этот origin в Google Cloud Console.
Автоматический E2E проверяет OAuth-поток с имитацией Google API; реальный live smoke не выполняется без отдельного тестового Client ID и аккаунта. Поэтому репозиторий не заявляет проверенную live-совместимость с конкретной Google конфигурацией.