Личный self-hosted трекер задач с четырьмя колонками, вложениями, Markdown и ZIP-резервными копиями. Приложение не требует аккаунта, внешних CDN или фронтенд-сборщика. По умолчанию оно слушает только локальный адрес компьютера и рассчитано на одного пользователя.
- Канбан: К выполнению, В работе, Ожидает, Готово.
- Быстрое создание задач клавишей Enter; горячие клавиши
N(новая задача),/или⌘/Ctrl + K(поиск),⌘/Ctrl + Shift + P(переключение проекта),?(справка),Esc(закрыть панель). - Проектные представления по тегам
project:<slug>; список проектов и последний выбранный проект запоминаются в браузере. Быстрое создание автоматически добавляет тег текущего проекта. - Рабочие наборы проекта: временная выборка задач, прогресс, автоматическое завершение и повторная активация, история событий и сохранение состава в ZIP-резервной копии.
- Расширенный поиск по заголовку, описанию и тегам с AND-логикой для нескольких слов и нормализацией
ё/е. - Командная палитра для переключения проекта, режим текущей задачи «В фокусе», компактная плотность карточек и предпросмотр распространённых форматов изображений во вложениях.
- Отмена последнего действия из уведомления: создание или редактирование задачи, перемещение, закрытие/повторное открытие, удаление задачи, загрузка или удаление вложений. Это кратковременная отмена, а не полноценная история изменений.
- Перетаскивание карточек между колонками и изменение порядка с сохранением в SQLite.
- Редактирование заголовка, Markdown-описания и результата (до 30 000 символов каждое), статуса и тегов; счётчики длины и полноэкранный режим рабочей области задачи. Предпросмотр поддерживает fenced-блоки кода с подсветкой синтаксиса через Pygments.
- Поиск по заголовку, описанию и тегам: все слова запроса должны совпасть,
ёиесчитаются эквивалентными. Фильтры проекта и обычного тега можно сочетать. В колонке «Готово» изначально отображаются пять последних закрытых задач. - Единый фильтр по типам и тегам с множественным выбором, счётчиками, чипами выбранных значений и сохранением фильтра в URL. Для каждой колонки отдельно настраивается только сортировка.
- При первом запуске после обновления типы из старых тегов переносятся в отдельное поле с автоматической резервной копией базы. Отчёт доступен через
GET /api/task-type-migration-report. - Архив завершённых задач с автоматическим архивированием после 30 дней без изменений, ручным архивированием, поиском, фильтрами и восстановлением. Архивные задачи и их вложения включаются в ZIP-резервную копию.
- Светлая и тёмная темы: тема автоматически учитывает системные настройки при первом запуске, а выбранный режим сохраняется в браузере.
- Мягкий WIP-лимит колонки «В работе».
- Множественная загрузка вложений из панели задачи, скачивание и удаление; имя файла на диске генерируется приложением.
- Импорт одного или нескольких
.mdфайлов в двух форматах: YAML frontmatter и чек-лист- [ ]/- [x]. - Экспорт всех задач в один Markdown-файл либо в ZIP с
tasks.jsonи файлами вложений. - Скрипт восстановления из ZIP, тесты, Ruff и Dockerfile.
- Создать задачу: введите заголовок в поле сверху и нажмите
Enter. Справа от поля выберите тип — он назначается новой задаче отдельно от тегов. Чтобы создать задачу сразу в другой колонке, нажмите+в заголовке этой колонки. - Изменить задачу: выберите карточку. В панели можно поменять заголовок, статус, тип, теги и описание; описание поддерживает Markdown и предпросмотр.
- Переместить задачу: перетащите карточку в другую колонку или на нужное место внутри колонки. Также статус можно изменить в панели задачи.
- Найти задачу: начните вводить запрос в поле поиска. Все слова должны встретиться в заголовке, описании или тегах, при этом порядок слов не важен. Например, запрос
оплата Германиянайдёт задачу, если в её доступном для поиска тексте есть оба слова. - Использовать теги: вводите теги через запятую, например
backend, идея. Теги помогают отбирать карточки независимо от статуса. - Вернуться к завершённым задачам: колонка «Готово» показывает пять последних закрытых задач. Нажмите «Показать ещё», чтобы раскрыть остальные активные завершённые задачи. Старые завершённые задачи могут автоматически попасть в архив.
- Фильтровать доску: откройте «Типы и теги» в верхней панели. Внутри каждой группы выбранные значения объединяются по ИЛИ, а группы типов и тегов — по И. Выбранные фильтры можно убрать отдельными чипами или сбросить все сразу. Состояние фильтра хранится в URL.
- Настроить колонку: нажмите кнопку сортировки в заголовке колонки. «Ручной порядок» возвращает перетаскивание внутри колонки.
- Открыть архив: меню «Настройки» → «Архив задач». Здесь можно искать архивные задачи, фильтровать их, менять период автоархивирования и восстанавливать задачи. Архивирование не удаляет описание или вложения.
- Настроить вид: переключатели в верхней части страницы меняют тему и плотность карточек. Настройки темы, плотности, проекта и задачи в фокусе хранятся в браузере; фильтр типов и тегов сохраняется в URL, а сортировка колонок — в браузере. Настройки автоматического архивирования хранятся в SQLite и действуют для всего локального приложения.
Горячие клавиши:
| Действие | Клавиши |
|---|---|
| Перейти к быстрому созданию задачи | N |
| Перейти к поиску | / или ⌘/Ctrl + K |
| Открыть переключатель проектов | ⌘ + Shift + P на macOS или Ctrl + Shift + P на Windows/Linux |
| Показать справку по клавишам | ? |
| Закрыть панель или диалог | Esc |
Буквенные сочетания привязаны к физическим клавишам и работают при любой раскладке. Клавиши N, / и ? не срабатывают во время ввода текста. Полный список можно открыть кнопкой ? в интерфейсе.
Flowboard не заводит отдельные записи проектов: задачи группируются тегами вида project:<slug>.
Ключ проекта — строчные латинские буквы, цифры и дефисы, например project:storefront, project:rope-knots или project:template-menu.
- Кнопка
+ Проектдобавляет представление и выбирает его. - При быстром создании новая задача получает тег выбранного проекта. Если дополнительно выбран обычный тег-фильтр, он тоже добавляется к задаче.
- Теги
project:*определяют список проектов. Проекты без задач и последний выбор сохраняются вlocalStorageэтого браузера. ⌘/Ctrl + Shift + Pоткрывает палитру быстрого переключения проекта. Импортированный Markdown с тегомproject:<slug>автоматически добавляет проект в список.- Поиск ищет слова в заголовке, описании и тегах; все слова запроса должны совпасть. Написания
ёиесчитаются эквивалентными.
Рабочий набор — необязательная временная группа задач одного проекта. Выберите проект, создайте набор и добавляйте в него существующие задачи через поле «Рабочий набор» в панели задачи. Быстрое создание задач при выбранном наборе добавляет их в этот набор автоматически.
- В переключателе рабочего набора можно показать все задачи проекта или только текущий состав выбранного набора. Выбор сохраняется отдельно для каждого проекта в браузере.
- Одна задача может входить только в один набор. Чтобы перенести задачу, выберите новый набор и подтвердите перенос из текущего.
- Прогресс учитывает только текущие связи. Набор завершается, когда в нём есть задачи и все они имеют статус «Готово». Повторное открытие любой задачи возвращает набор в активные; повторное завершение снова закрывает его.
- Завершённые наборы находятся в истории. Их можно просматривать, переименовывать и удалять из них задачи, но добавлять новые задачи в завершённый набор нельзя.
- Если пользователь удаляет из набора последнюю задачу, набор удаляется; события остаются в истории проекта. Удаление самой задачи из проекта также записывается в историю.
- ZIP-резервная копия сохраняет рабочие наборы, текущие связи и историю. Markdown-экспорт предназначен для переноса задач и не переносит структуру рабочих наборов.
После поддерживаемого действия на экране появляется уведомление с кнопкой отмены. Кнопка доступна недолго — примерно 8,5 секунды. Новое уведомление об отменяемом действии заменяет предыдущее; это не многошаговая история и не аналог системного Ctrl+Z.
Можно отменить:
- создание задачи — новая задача будет удалена;
- редактирование — вернутся прежние заголовок, описание, статус, позиция и теги;
- перемещение, закрытие или повторное открытие — восстановятся прежние статус и позиция;
- удаление задачи — задача будет создана заново вместе с содержимым вложений;
- загрузку одного или нескольких вложений — удалятся файлы из отменённой загрузки;
- удаление вложения — сохранённый файл загрузится обратно в задачу.
Особенности восстановления: при отмене удаления задачи создаётся новая запись: её ID и временные метки отличаются от исходных. Восстановленные вложения также получают новые записи и ID. Резервная копия остаётся надёжным способом сохранить данные независимо от кратковременной отмены в интерфейсе.
Кнопка «В фокус» закрепляет выбранную задачу в верхней панели. Переключатель плотности меняет комфортный и компактный вид карточек. Эти настройки сохраняются локально в браузере, не меняют схему базы данных и не включаются в ZIP-экспорт.
- Python 3.12 или новее.
- uv для установки зависимостей и команд проекта.
Из каталога проекта:
uv sync --dev
uv run uvicorn app.main:appОткройте http://127.0.0.1:8000. Первый запуск автоматически создаст data/tracker.db и каталог data/attachments/.
Приложение не имеет собственной авторизации. По умолчанию Uvicorn слушает локальный интерфейс 127.0.0.1, поэтому для личного использования не требуется публиковать его в интернет. Не запускайте его с --host 0.0.0.0 в недоверенной сети. Для удалённого доступа разместите его за reverse proxy с авторизацией.
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
TRACKER_DATA_DIR |
./data в каталоге проекта |
Каталог базы SQLite и вложений |
TRACKER_MAX_FILE_SIZE_MB |
20 |
Максимальный размер одного вложения |
TRACKER_WIP_LIMIT |
3 |
Мягкий лимит задач в колонке «В работе» |
Например, на macOS/Linux:
TRACKER_DATA_DIR="$HOME/.local/share/flowboard" TRACKER_WIP_LIMIT=4 uv run uvicorn app.main:appВсе пользовательские данные находятся в каталоге данных; резервная копия также входит в ZIP-экспорт.
Можно выбрать сразу несколько .md файлов в интерфейсе. Дубли заголовков намеренно допускаются, существующие задачи не изменяются.
---
title: Починить авторизацию
status: todo
tags: [backend]
task_type: bug
---
Короткое описание задачи. Поддерживается **Markdown**.Допустимые статусы: todo, doing, waiting, done. Неизвестный или отсутствующий статус превращается в todo. Если для done не задан closed_at, оно заполняется автоматически.
# Следующие задачи
- [ ] Добавить тесты API
- [x] Настроить форматирование
- [ ] Проверить экспортКаждый пункт чек-листа создаёт отдельную задачу. Отмеченные x пункты становятся завершёнными, остальные переходят в «К выполнению». Обычный текст вокруг пунктов игнорируется.
Файл tasks-YYYY-MM-DD.md, полученный через GET /api/export?format=md, содержит специальный маркер и может быть импортирован обратно целиком — в отличие от обычного файла формата A, он восстанавливает несколько задач из одного файла.
В интерфейсе резервная копия скачивается через «Настройки» → «Проекты и организация» → «Данные и резервные копии». ZIP содержит tasks.json и папку attachments/<task_id>/... со всеми доступными файлами, исходными именами вложений и метаданными, нужными для восстановления.
Для совместимости массовый Markdown-экспорт остаётся доступен через GET /api/export?format=md, но отдельная кнопка экспорта не занимает место на главном экране. Он создаёт человекочитаемый Markdown с группировкой по колонкам, описаниями, тегами, датами и именами вложений; сами файлы вложений в него не входят.
Рекомендуется восстанавливать в новый каталог, не поверх текущих рабочих данных:
uv run python -m app.restore /path/to/tasks-2026-10-22.zip --data-dir ./data-restored
TRACKER_DATA_DIR="$PWD/data-restored" uv run uvicorn app.main:appСуществующий непустой каталог защищён от случайной перезаписи. Флаг --replace разрешает его замену:
uv run python -m app.restore backup.zip --data-dir ./data --replaceПеред --replace убедитесь, что в архиве актуальная резервная копия. Восстановление создаёт базу заново из tasks.json и распаковывает вложения без выполнения и открытия файлов.
Если вы меняете код с помощью ИИ-агента, сначала прочитайте AGENTS.md: там описаны архитектура, ограничения безопасности и порядок проверки изменений.
uv run pytest
uv run ruff check .
uv run ruff format --check .Чтобы автоматически исправить форматирование:
uv run ruff check . --fix
uv run ruff format .В тестах используется временная SQLite-база и отдельный каталог вложений; реальные пользовательские данные не затрагиваются.
docker build -t flowboard .
docker run --rm -p 127.0.0.1:8000:8000 -v flowboard-data:/app/data flowboardПриложение будет доступно на http://127.0.0.1:8000. Docker-образ запускается не от root и хранит состояние в примонтированном /app/data.
app/
main.py # FastAPI, CRUD, API вложений, импорт и экспорт
db.py # SQLite-схема и подключения
models.py # Pydantic-схемы API
importer.py # Разбор Markdown и чек-листов
exporter.py # Markdown и ZIP экспорт
markdown.py # Безопасный Markdown preview
restore.py # Восстановление ZIP-резервной копии
config.py # Пути и конфигурация
static/
index.html
app.js
dragdrop.js
style.css
data/ # tracker.db и attachments/ (не добавляются в Git)
tests/
В среде сборки не было сетевого доступа, поэтому официальный файл SortableJS не удалось загрузить. Чтобы готовый проект оставался автономным, в static/dragdrop.js реализован небольшой адаптер с совместимым для этого интерфейса контрактом Sortable.create(..., { onEnd }), использующий нативный HTML5 drag-and-drop. Он покрывает перемещение карточек между четырьмя колонками и изменение порядка без CDN или дополнительных зависимостей. Официальный локальный SortableJS можно подставить вместо адаптера без изменения API бэкенда.
- Встроенной авторизации нет; запускайте локально либо за reverse proxy с авторизацией.
- Ввод пользователя выводится через DOM API, а Markdown preview очищается на сервере.
- Имена на диске генерируются UUID; исходное имя хранится в базе данных.
- Импорт ограничивает размер одного Markdown-файла 10 МБ; вложения ограничены конфигурируемым размером.
- Проектные представления группируют задачи по тегам и не являются отдельными сущностями в базе данных.
- В MVP нет подзадач, комментариев, уведомлений, сроков, общей истории отмены, синхронизации между пользователями и многопользовательского режима.