diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6b52deb..75e132a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,10 +6,30 @@
## [Unreleased]
+### Added
+
+- Общий shadcn/ui-слой на Radix UI, CVA, Lucide и семантических theme tokens.
+- Responsive workspace shell, command palette, task composer dialog и desktop/mobile documentation gallery.
+- Актуальный production-логотип в SVG/PNG, favicon и product preview.
+
+### Changed
+
+- Главная теперь сфокусирована на личной работе, очередях разбора/review и последних изменениях.
+- List и Kanban используют единые фильтры и представления; task rows стали read-first и ведут в карточку.
+- Аналитика показывает только измеримые свойства текущей модели: WIP, review, незакреплённые и stale tasks.
+- `/pages/my` оставлен как legacy redirect на overview; отдельная маркетинговая workspace-страница удалена.
+- Web-контейнер доступен только внутри Compose-сети, публичный browser endpoint обслуживает Nginx.
+
+### Removed
+
+- Повторяющиеся KPI/summary blocks, постоянная inline-форма создания и недостоверный project pulse score.
+
### Fixed
- GitHub Actions и Docker builds больше не зависят от устаревшего Corepack keyring в Node.js 22.13.1;
точная версия `pnpm@9.15.4` устанавливается напрямую, а workspace scripts используют активный pnpm.
+- Refresh/logout больше не делят строгий edge rate limit с login, что устраняет ложный разлогин при серии
+ обычных перезагрузок; login и invitation acceptance сохраняют отдельный строгий лимит.
## [1.1.0] - 2026-08-21
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index af51d1a..8564a5b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -54,6 +54,9 @@ docker compose config --quiet
Добавляйте тесты для authorization boundaries, межорганизационной изоляции, token lifecycle,
миграций, кеш-инвалидации и realtime-подписок.
+При заметном изменении UI обновите production-галерею по инструкции
+[`docs/screenshots/README.md`](./docs/screenshots/README.md) и визуально проверьте desktop/mobile кадры.
+
## Коммиты и pull request
Используйте небольшие Conventional Commits: `feat:`, `fix:`, `refactor:`, `test:`, `docs:`, `chore:`,
diff --git a/README.md b/README.md
index 7906c16..0618d7f 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
Tracker
Командный task tracker с организациями, ролями, realtime-доской и безопасной browser session.
@@ -14,10 +14,9 @@
---
-Tracker — full-stack монорепозиторий для управления проектами и задачами. Он сочетает быстрый
-Next.js-интерфейс, versioned NestJS API, PostgreSQL/Prisma, Redis cache и Socket.IO. Проект рассчитан
-на развитие как модульный монолит: границы домена явные, а frontend и backend можно развёртывать
-независимо.
+Tracker — full-stack монорепозиторий для управления проектами и задачами. Актуальный интерфейс построен
+вокруг личного фокуса, очередей разбора, компактного списка, Kanban и измеримой аналитики потока.
+Frontend и API развёртываются независимо, а backend сохраняет границы модульного монолита.
> [!IMPORTANT]
> Репозиторий предоставляет укреплённый baseline, но не заменяет production-платформу. Перед публичным
@@ -27,8 +26,12 @@ Next.js-интерфейс, versioned NestJS API, PostgreSQL/Prisma, Redis cache
## Возможности
- организации, membership-роли `OWNER` / `ADMIN` / `MEMBER` и проекты;
-- задачи с приоритетами, статусами, исполнителями, фильтрами и сохранёнными представлениями;
-- list, kanban, overview, analytics и детальная карточка задачи;
+- задачи с приоритетами, статусами, исполнителями, фильтрами и локально сохранёнными представлениями;
+- рабочая главная с личной очередью, разбором, review и последними изменениями;
+- компактный list view, Kanban с drag-and-drop и едиными фильтрами;
+- измеримая аналитика WIP, review, незакреплённых и давно не обновлённых задач;
+- полноценная карточка задачи с редактированием, комментариями, activity и подборкой похожих задач;
+- command palette, горячая клавиша создания, светлая/тёмная тема и responsive mobile UI;
- комментарии и история активности;
- realtime-инвалидация данных через защищённые project rooms Socket.IO;
- приглашения с одноразовым токеном и сроком действия;
@@ -37,24 +40,26 @@ Next.js-интерфейс, versioned NestJS API, PostgreSQL/Prisma, Redis cache
- Docker Compose и Kubernetes base с restricted security context;
- CI: lint, typecheck, 17 API tests, build, dependency audit, CodeQL и Dependency Review.
-## Скриншоты
+## Интерфейс
-| Вход | Рабочее пространство |
-| --- | --- |
-|  |  |
+
-| Обзор | Задачи |
+| Вход | Список задач |
| --- | --- |
-|  |  |
+|  |  |
-| Доска | Аналитика |
+| Kanban | Аналитика потока |
| --- | --- |
-|  |  |
+|  |  |
-Карточка задачи
+Карточка задачи и мобильный интерфейс
+
+
-
+| Мобильная главная | Мобильный список |
+| --- | --- |
+|  |  |
@@ -107,7 +112,7 @@ decisions: при его отказе API продолжает работать
- production runtime выполняет `prisma migrate deploy`, а demo seed выключен по умолчанию;
- сервисы запускаются без root, с read-only filesystem/capability restrictions;
- plaintext Kubernetes Secret не хранится в репозитории;
-- high-severity dependency audit на 2026-08-21: 0 известных уязвимостей.
+- high-severity dependency audit на 2026-08-27: 0 известных уязвимостей.
Не публикуйте уязвимости в issues. Используйте процедуру из [`SECURITY.md`](./SECURITY.md). Полная модель
угроз и residual risks: [`docs/THREAT_MODEL.md`](./docs/THREAT_MODEL.md).
@@ -116,7 +121,7 @@ decisions: при его отказе API продолжает работать
| Область | Стек |
| --- | --- |
-| Web | Next.js 15, React 19, React Query 5, Zustand 5, dnd-kit |
+| Web | Next.js 15, React 19, shadcn/ui, Radix UI, React Query 5, Zustand 5, dnd-kit |
| API | NestJS 11, Passport JWT, Socket.IO 4, class-validator |
| Data | PostgreSQL 16, Prisma 6, Redis 7 |
| Tooling | TypeScript 5.9, ESLint 8, Node test runner, pnpm 9 |
@@ -160,8 +165,8 @@ docker compose ps
| Swagger (если включён) | `http://localhost:8080/api/docs` |
| API readiness | `http://localhost:8080/api/health/ready` |
-Прямые порты PostgreSQL, Redis, API и Web привязаны к loopback для локальной диагностики. Публичной
-точкой входа считается Nginx на `8080`.
+Прямые порты PostgreSQL, Redis и API привязаны к loopback для локальной диагностики. Web-контейнер
+доступен только внутри Compose-сети: единственной браузерной точкой входа является Nginx на `8080`.
Остановить окружение:
@@ -241,6 +246,9 @@ pnpm db:migrate # development migration flow
pnpm db:seed # explicit demo seed
```
+Документационные скриншоты снимаются с production-сборки через Nginx на `8080`; SVG/PNG логотип и
+product preview находятся в [`apps/web/public`](./apps/web/public).
+
Полная проверка deployment manifests:
```bash
@@ -315,6 +323,7 @@ Access token намеренно не сохраняется в browser storage.
- [Threat model](./docs/THREAT_MODEL.md)
- [Operations runbook](./docs/operations/runbook.md)
- [Frontend audit](./docs/frontend-audit.md)
+- [Обновление скриншотов](./docs/screenshots/README.md)
- [Security policy](./SECURITY.md)
- [Contributing](./CONTRIBUTING.md)
- [Changelog](./CHANGELOG.md)
diff --git a/apps/api/README.md b/apps/api/README.md
index 029d6d8..f924ba8 100644
--- a/apps/api/README.md
+++ b/apps/api/README.md
@@ -20,6 +20,9 @@ NestJS backend для аутентификации, организаций, пр
Полный список routes генерируется Swagger из запущенного приложения.
+На edge login и invitation acceptance используют отдельный строгий limit. Refresh/logout проходят через
+общий API edge limit; controller policies дополнительно ограничивают refresh/logout до 30 запросов в минуту.
+
## Архитектурные границы
```text
diff --git a/apps/web/README.md b/apps/web/README.md
index 23062be..7cd116f 100644
--- a/apps/web/README.md
+++ b/apps/web/README.md
@@ -1,6 +1,6 @@
# Tracker Web
-Next.js App Router frontend для overview, списка задач, kanban-доски, аналитики и task details.
+Next.js App Router frontend для личного рабочего фокуса, списка задач, Kanban, аналитики потока и task details.
## Слои
@@ -12,10 +12,29 @@ Next.js App Router frontend для overview, списка задач, kanban-д
| `lib` | API client, React Query keys и realtime hooks |
| `store` | in-memory session и persisted UI preferences |
| `shared` | icons и общие frontend utilities |
-| `@tracker/ui` | переиспользуемые UI primitives |
+| `@tracker/ui` | shadcn/ui-примитивы на Radix UI, CVA и семантические theme tokens |
Backend DTO импортируются из `@tracker/types`; page components не дублируют transport contracts.
+## UI system
+
+Компоненты интерфейса находятся в `packages/ui` и следуют композиционной модели shadcn/ui. Radix UI
+обеспечивает focus management и keyboard behavior для dialog, dropdown и tooltip; визуальные варианты
+задаются через CVA, а классы объединяются через общий `cn`. Цвета экранов используют семантические
+CSS variables (`background`, `foreground`, `primary`, `muted`, `destructive`), поэтому светлая и тёмная
+темы не требуют локальных цветовых исключений. Конфигурация генератора находится в `components.json`.
+
+Production-знак Tracker хранится в [`public/logo.svg`](./public/logo.svg); PNG fallback, favicon и
+product preview лежат рядом. Документационная галерея находится в [`../../docs/screenshots`](../../docs/screenshots).
+
+## Информационная архитектура
+
+- overview отвечает на вопрос «что делать дальше»: личная работа, разбор, review и свежие изменения;
+- list оптимизирован для сканирования, а изменение полей выполняется в task detail;
+- list и Kanban читают один набор фильтров/views из Zustand, но сами задачи остаются server state;
+- create task открывается как dialog из shell, route toolbar, command palette или клавиши `C`;
+- analytics не выводит health/capacity score без estimates и completion timestamps.
+
## Session model
- Access token хранится только в памяти Zustand store и исчезает при reload.
@@ -39,11 +58,11 @@ Realtime hook подключается к namespace `/tasks`, подписыва
## Маршруты
- `/` — overview;
-- `/pages/my` — workspace entry;
+- `/pages/my` — legacy redirect на overview;
- `/tasks` — список и фильтры;
- `/tasks/[taskId]` — карточка, комментарии и activity;
- `/boards` — kanban;
-- `/analytics` — распределение и показатели проекта.
+- `/analytics` — измеримые показатели потока задач.
Горячие клавиши: `C` для create task, `Ctrl+K` / `⌘K` для command palette.
@@ -57,7 +76,8 @@ NEXT_PUBLIC_SOCKET_URL=http://localhost:3001
```
`NEXT_PUBLIC_*` встраиваются в browser bundle и не должны содержать секреты. Для same-origin deployment
-используйте `/api/v1` и публичный origin ingress/Nginx для Socket.IO.
+используйте `NEXT_PUBLIC_API_URL=/api/v1` и пустой `NEXT_PUBLIC_SOCKET_URL`: browser подключится к
+публичному origin ingress/Nginx. Значения выше предназначены для запуска Web/API без reverse proxy.
## Команды
diff --git a/apps/web/components.json b/apps/web/components.json
new file mode 100644
index 0000000..68e2181
--- /dev/null
+++ b/apps/web/components.json
@@ -0,0 +1,9 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": { "config": "tailwind.config.ts", "css": "src/app/globals.css", "baseColor": "slate", "cssVariables": true, "prefix": "" },
+ "aliases": { "components": "@tracker/ui", "utils": "@tracker/ui", "ui": "@tracker/ui", "lib": "@/lib", "hooks": "@/hooks" },
+ "iconLibrary": "lucide"
+}
diff --git a/apps/web/package.json b/apps/web/package.json
index 48d3393..dc8eefe 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -16,6 +16,7 @@
"@tracker/types": "workspace:*",
"@tracker/ui": "workspace:*",
"clsx": "^2.1.1",
+ "lucide-react": "^1.34.0",
"next": "^15.5.23",
"next-themes": "^0.4.6",
"react": "^19.2.8",
diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg
index b46396b..4607ae5 100644
--- a/apps/web/public/favicon.svg
+++ b/apps/web/public/favicon.svg
@@ -1,17 +1,14 @@
diff --git a/apps/web/public/logo.png b/apps/web/public/logo.png
index f083ef1..73fede6 100644
Binary files a/apps/web/public/logo.png and b/apps/web/public/logo.png differ
diff --git a/apps/web/public/logo.svg b/apps/web/public/logo.svg
new file mode 100644
index 0000000..d0fd7b4
--- /dev/null
+++ b/apps/web/public/logo.svg
@@ -0,0 +1,15 @@
+
diff --git a/apps/web/public/preview.png b/apps/web/public/preview.png
index 295c9fc..14af967 100644
Binary files a/apps/web/public/preview.png and b/apps/web/public/preview.png differ
diff --git a/apps/web/src/app/analytics/page.tsx b/apps/web/src/app/analytics/page.tsx
index 3c5c91d..16813fa 100644
--- a/apps/web/src/app/analytics/page.tsx
+++ b/apps/web/src/app/analytics/page.tsx
@@ -7,7 +7,7 @@ export default function AnalyticsPage() {
return (
{(data) => }
diff --git a/apps/web/src/app/boards/page.tsx b/apps/web/src/app/boards/page.tsx
index 06d3220..fc9bf87 100644
--- a/apps/web/src/app/boards/page.tsx
+++ b/apps/web/src/app/boards/page.tsx
@@ -3,49 +3,34 @@
import type { Route } from "next";
import dynamic from "next/dynamic";
import { useRouter } from "next/navigation";
-import { Badge } from "@tracker/ui";
import { BoardFilter } from "@/features/board-filter/ui/board-filter";
import { TaskCreate } from "@/features/task-create/ui/task-create";
import { TaskViewBar } from "@/features/task-view/ui/task-view-bar";
-import { statusLabels, statusOrder, statusTone } from "@/lib/task-meta";
import { SkeletonBoard } from "@/shared/ui/skeleton-board";
-import { countByStatus } from "@/widgets/workspace-shell/lib/task-utils";
import { WorkspacePage } from "@/widgets/workspace-shell/ui/workspace-shell";
const KanbanBoard = dynamic(
() => import("@/widgets/kanban-board/ui/kanban-board").then((module) => module.KanbanBoard),
- {
- ssr: false,
- loading: () => ,
- },
+ { ssr: false, loading: () => },
);
export default function BoardsPage() {
const router = useRouter();
-
return (
-
+
{(data) => (
)}
diff --git a/apps/web/src/app/pages/my/page.tsx b/apps/web/src/app/pages/my/page.tsx
index 9d2539f..96d51da 100644
--- a/apps/web/src/app/pages/my/page.tsx
+++ b/apps/web/src/app/pages/my/page.tsx
@@ -1,112 +1,5 @@
-"use client";
+import { redirect } from "next/navigation";
-import Link from "next/link";
-import { ActivityIcon, BoardIcon, CheckCircleIcon, ListIcon, ProjectsIcon, QueueIcon } from "@/shared/ui/tracker-icons";
-import { WorkspacePage } from "@/widgets/workspace-shell/ui/workspace-shell";
-
-const trackerSections = [
- {
- icon: ListIcon,
- title: "Задачи",
- description: "Личный и командный список для triage, поиска, фильтрации и быстрого перехода в карточку.",
- },
- {
- icon: ProjectsIcon,
- title: "Проекты и портфели",
- description: "Контекст работы команды: выбранный проект управляет задачами, досками и отчётами.",
- },
- {
- icon: QueueIcon,
- title: "Очереди",
- description: "Фокусные подборки: мои задачи, без исполнителя, ревью и другие рабочие потоки.",
- },
- {
- icon: BoardIcon,
- title: "Доски задач",
- description: "Kanban с drag-and-drop сменой статусов и синхронизацией через API.",
- },
- {
- icon: ActivityIcon,
- title: "Дашборды и отчёты",
- description: "Сводка прогресса, распределение по статусам и нагрузка команды.",
- },
- {
- icon: CheckCircleIcon,
- title: "История",
- description: "Изменения задач и активность проекта помогают быстро восстановить контекст.",
- },
-];
-
-export default function MyPage() {
- return (
-
- {(data) => (
-
-
-
-
Tracker Pro
-
- Рабочий контур для задач, досок и решений команды.
-
-
- Здесь собраны маршруты трекера, проектный контекст и быстрый вход в рабочие сценарии. После входа вы всегда попадаете сюда,
- чтобы выбрать следующий шаг без лишнего шума.
-