Для чего
Личные задачи, проекты, приоритеты и теги в духе 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.