Проекты, задачи, цели, звонки, AI-агент, MCP — в одном приложении.
Каждый блок описывает что есть в продукте на этом шаге. Все шаги связаны — задача знает про звонок, из которого появилась; PR знает про задачу, к которой принадлежит; релиз знает про задачи, которые в нём поехали.
LiveKit-комнаты прямо внутри. Постоянные для команды, ad-hoc по ссылке для гостей. На звонке работает realtime-экстрактор: слушает разговор и предлагает задачи и action items карточками, которые принимаются одной кнопкой. Egress пишет запись на диск, post-call extractor строит summary с тайм-кодами.
Учитываются отпуск, больничный, командировка и фокус-блоки: если зовёшь на встречу человека с активным absence — появится предупреждение.
Список, kanban с drag-pan, timeline с now-line. Подзадачи в drawer и fullpage с одинаковым набором действий, drag-drop reorder среди соседей одного parent. Комментарий ведёт себя как чат: @-mentions, rich-text через TipTap, drag-drop загрузка изображений, code blocks, чек-листы.
Задачи группируются в цели (milestones) с дедлайном и прогрессом N/M. Цели крепятся к проекту, видны в общей workspace-ленте /milestones с фильтрами upcoming / passed / cancelled. У каждой — отдельная страница с progress-bar и списком задач.
Multi-select фильтры по статусам, приоритетам и исполнителям одновременно. SSE-канал держит состояние синхронным во всех открытых вкладках. Push-уведомления с группировкой по сущности, deep-link открывает drawer на нужном комментарии.
В настройках проекта — кнопка «Новый репозиторий»: создаёт репу на GitHub через App-installation и привязывает её к проекту автоматически. Для существующих реп — AI-suggest по Dockerfile / build spec (image, port, env, healthcheck) для подготовки к деплою.
В карточке задачи — кнопка создания ветки. Имя берётся из slug'а задачи. PR, привязанный к задаче по имени ветки, отображается в карточке с состоянием (open / merged / closed), статусом code-review (approved / changes_requested / commented) и комбинированным CI-статусом.
Preview environment на каждый PR — отдельное окружение с собственными env-переменными. Значения хранятся в БД зашифрованными (AES-256-GCM); UI показывает revealable-rows для редактирования.
YAML-парсер для GitHub Actions: workflows из репы видны прямо в taskless, deploy запускается кнопкой. В карточке релиза — список задач, которые в этот релиз попадают (по веткам / PR-ам, привязанным к задачам). После деплоя задачи автоматически переходят в following-статус.
В приложении живёт чат с AI-агентом, у которого есть набор tool'ов для работы с сущностями taskless. Параллельно умеет искать задачи, встречи, проекты и absences — типичный запрос «что не успели за неделю» вызывает findTasks + findMeetings + findAbsences одновременно и собирает overdue вместе с «обсуждалось на созвоне, задачи нет».
Ответы агента — не только текст: он умеет возвращать proposal-карточки (создать задачу, обновить, перенести срок, назначить), которые принимаются одной кнопкой. Тот же набор tool'ов выставлен наружу как MCP-сервер — 15 тулов по одному HTTP-эндпоинту, OAuth 2.1, читается любым AI-клиентом (Claude Code, Cursor, Continue).
findTasks + findMeetings + findAbsences параллельно. Вот что нашёл:Звонки построены на LiveKit и работают прямо внутри приложения. Бывают двух видов: постоянные комнаты (привязаны к проекту, заходят и выходят свободно) и ad-hoc по ссылке, которая открывается без регистрации — гость попадает в greenroom настроить камеру и звук.
На звонке работают два пайплайна AI-экстрактора. Realtime — пишет watermark и каждые несколько секунд отправляет дельту в LLM, по результатам появляются proposal-карточки прямо в правом сайдбаре: «создать задачу», «зафиксировать решение», «назначить исполнителя». Post-call — после окончания собирает полный summary с тайм-кодами, привязанными к timeline-событиям из встречи.
LiveKit Egress пишет видеозапись на диск (плеер с тайм-кодами уже есть, S3-storage в roadmap). Все proposal'ы и timeline-события остаются после звонка — можно вернуться и принять то, что не успели.
Задачи открываются в drawer (рядом со списком) или в fullpage — оба вида показывают одинаковый набор действий. Подзадачи имеют drag-drop reorder среди соседей одного parent. Multi-select фильтры работают по нескольким измерениям одновременно: статус × приоритет × исполнители, под результатами — ActiveFiltersBar с возможностью сбросить одним кликом.
Комментарий — это полноценный rich-text-блок на TipTap: @-mentions с автокомплитом, изображения через drag-drop прямо в текст, code blocks с подсветкой через lowlight, чек-листы. После публикации уведомление приходит через web push с группировкой по сущности, deep-link открывает drawer ровно на нужном комментарии.
Состояние во всех открытых вкладках держится синхронным через SSE-канал на workspace: новый комментарий, изменение статуса, назначение — всё доезжает без перезагрузки.
Не killer features, но именно они часто становятся причиной «удобно».
В карточке задачи есть секция Previews — нажимаешь «+ Поднять», и из ветки задачи запускается отдельный preview-стенд. UI показывает прогресс по фазам: В очереди → Сборка (отдельный кружок на каждый build-step монорепо) → Pull → Sidecars → Старт → Прогрев → Готово. По окончании появляется URL — можно потыкать руками или показать заказчику.
Каждый стенд — отдельный docker-контейнер с --rm, то есть при стопе он сам удаляется. Стоп — кнопкой в UI. Параллельно работает cleanup-cron: ищет зомби-контейнеры (БД-row есть, контейнер живёт сам по себе, или наоборот) и подчищает.
Каждый вызов LLM (Claude) проходит через checkAiQuota и записывается в таблицу AiUsage с моделью, токенами и стоимостью. На workspace есть две квоты: общий лимит на весь workspace и per-member лимит — обе расходуются параллельно. Период — месячный по умолчанию.
В UI — AiQuotaBanner, показывает сколько осталось и когда сброс. Эндпоинт /api/ai/state отдаёт состояние; есть aggregate и groupBy-by-model для статистики использования. Когда лимит исчерпан — LLM-вызов отклоняется до сброса периода, остальной taskless продолжает работать как обычно.
В админ-настройках workspace есть лента audit-событий — кто и когда менял настройки, инвайтил людей, переименовывал, удалял интеграции. Эндпоинт GET /workspaces/:id/audit, доступ только админам workspace.
Сейчас в зачатке — пишутся базовые события (создание/изменение/удаление настроек), формат уже устаканен и расширяется по мере добавления новых событий. Никаких per-task / per-comment audit'ов сейчас нет — только workspace-level.
Отдельная страница /notifications — лента всех уведомлений пользователя, не только последние. Группировка по дням (Сегодня / Вчера / конкретные даты), пагинация по 30. Поверх — фильтр по workspace, чтобы видеть только нужный.
Уведомления делятся на 4 типа bubble: task (ListChecks-иконка), meeting (Phone), comment (MessageSquare), system (FileText). Для задач/комментариев из title парсится автор и рендерится отдельным аватаром — actor-уведомления уходят влево, system'ные (recording_finished, transcription_finished и т.п.) — вправо.
SSE-stream подписывается на новые уведомления в реальном времени — лента обновляется без перезагрузки. Каждое уведомление кликабельно: deep-link через navigateToHref открывает нужную задачу/встречу/комментарий.
Мелкие фичи, которые есть в коде и работают. Каждая — реальный модуль из репозитория.
Список, kanban с drag-pan, timeline с now-line. Фильтры и сортировка переходят между видами без потери состояния.
15 тулов, OAuth 2.1. Управляй taskless из Claude Code, Cursor или Continue. Создавай задачи прямо из чата с агентом.
LiveKit Egress пишет в Redis-volume. Плеер с тайм-кодами привязан к timeline-событиям из встречи.
Из настроек проекта: новый GitHub-репозиторий через App-installation, привязан к проекту автоматически.
Drawer и fullpage с одинаковым набором действий. Drag-drop reorder среди соседей одного parent.
Группы задач с дедлайном и прогрессом N/M. Workspace-wide лента /milestones с фильтрами upcoming / passed / cancelled, drag-reorder в MilestoneRail.
Статусы, приоритеты, исполнители — все одновременно. ActiveFiltersBar показывает что выбрано, одной кнопкой очистка.
Каждый пользователь авторизуется через свой GitHub. Запросы к API идут через его токены — атрибуция корректна.
TipTap-редактор: @-mentions, изображения, code blocks, чек-листы. Drag-drop загрузка прямо в комментарий.
Web Push с группировкой по сущности. Deep-link открывает drawer на нужном комментарии. Persistent история.
Календарь с now-line. Бэклог и запланированное симметричны. Митинг автоматически добавляет создателя.
На каждый PR — изолированное окружение. Env-переменные хранятся зашифрованными (AES-256-GCM). YAML-парсер GH Actions, deploy из taskless.
«Покажи задачи Анны на этой неделе» — агент сам строит URL и перенаправляет. Per-page meta для каждого роута.
Монорепо на pnpm + turbo, три пакета: API (Node/Express, ESM, ts → dist), frontend (React 19 + Vite SPA) и shared (zod-схемы, общие типы). Данные в Postgres через Prisma. Live-обновления через SSE-канал на workspace, push через web-push (VAPID).
Звонки — LiveKit. Realtime AI-экстрактор и post-call summary — два отдельных пайплайна, оба ходят в Claude. Запись через LiveKit Egress с Redis-volume. MCP-сервер — отдельный HTTP-эндпоинт с OAuth 2.1, выставляет те же 15 тулов, что и внутренний агент.
Self-hosted: один docker compose up поднимает весь стек.
Провайдеры моделей и звонков подключаются через ENV, не зашиты в код.