Для чего

Личные задачи, проекты, приоритеты и теги в духе Todoist и Things, но на своём сервере. Главное требование — офлайн: каждый клиент держит полную реплику и отвечает на вопрос «что сегодня» без сети.

Что работает

  • Синхронизация. Один эндпоинт POST /api/v1/sync принимает операции и отдаёт изменения. Конфликты решаются по полям, побеждает последняя запись. Удалённые записи чистятся, а клиент с устаревшим курсором получает свежий снапшот.
  • CLI. Команды todoer add, list и outbox работают с локальной репликой в SQLite. Операция сначала встаёт в очередь и сохраняет свой id при повторах, поэтому повторный add не создаёт дубль.
  • Для скриптов и агентов. Вывод в --json и коды возврата, по которым можно ветвиться: код 5 означает, что сервер недоступен и операция ждёт в очереди.

В планах

  • Проекты и теги из быстрого ввода, повторяющиеся задачи.
  • Представления: список, канбан, календарь.
  • Веб-клиент и приложение на Flutter.
  • Трекер привычек во второй версии.

Под капотом

NestJS 11, Prisma и Postgres 18. REST-CRUD нет: любая запись идёт через протокол синхронизации. Контракт описан в OpenAPI, и express-openapi-validator проверяет его в обе стороны. Репозиторий создан из шаблона project-skeleton.