Skip to content
WwwoperPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

119 Commits

Folders and files

Repository files navigation

Flowboard — лёгкий канбан-трекер

Личный 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-экспорт.

Импорт Markdown

Можно выбрать сразу несколько .md файлов в интерфейсе. Дубли заголовков намеренно допускаются, существующие задачи не изменяются.

Формат A — одна задача на файл

---
title: Починить авторизацию
status: todo
tags: [backend]
task_type: bug
---
Короткое описание задачи. Поддерживается **Markdown**.

Допустимые статусы: todo, doing, waiting, done. Неизвестный или отсутствующий статус превращается в todo. Если для done не задан closed_at, оно заполняется автоматически.

Формат B — чек-лист

# Следующие задачи
- [ ] Добавить тесты 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

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/

Примечание о drag-and-drop

В среде сборки не было сетевого доступа, поэтому официальный файл SortableJS не удалось загрузить. Чтобы готовый проект оставался автономным, в static/dragdrop.js реализован небольшой адаптер с совместимым для этого интерфейса контрактом Sortable.create(..., { onEnd }), использующий нативный HTML5 drag-and-drop. Он покрывает перемещение карточек между четырьмя колонками и изменение порядка без CDN или дополнительных зависимостей. Официальный локальный SortableJS можно подставить вместо адаптера без изменения API бэкенда.

Безопасность и ограничения MVP

  • Встроенной авторизации нет; запускайте локально либо за reverse proxy с авторизацией.
  • Ввод пользователя выводится через DOM API, а Markdown preview очищается на сервере.
  • Имена на диске генерируются UUID; исходное имя хранится в базе данных.
  • Импорт ограничивает размер одного Markdown-файла 10 МБ; вложения ограничены конфигурируемым размером.
  • Проектные представления группируют задачи по тегам и не являются отдельными сущностями в базе данных.
  • В MVP нет подзадач, комментариев, уведомлений, сроков, общей истории отмены, синхронизации между пользователями и многопользовательского режима.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages