О проекте
Команда: AIB2BSaaSSixSeven
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Веб-сервис: по аудио или видео совещания строится транскрипт со спикерами и таймкодами, краткий итог и поручения с цитатами. Человек проверяет и правит черновик, утверждает его и скачивает PDF.
Как устроено
Next.js-клиент загружает файл до 100 MiB в FastAPI. Backend проверяет формат по содержимому, извлекает аудиодорожку через ffmpeg и отправляет задачу на собственный NVIDIA inference API команды (распознавание, диаризация, извлечение итогов и поручений). Долговечный координатор с idempotency-ключами отслеживает этапы, валидирует версионированный результат и ссылки поручений на доказательства, атомарно сохраняет результат в DATA_ROOT. Затем идёт ревью и утверждение ревизии и экспорт PDF. Supabase используется только для авторизации, внешние облачные AI не применяются.
Ключевые решения
- ASR
- speaker diarization
- извлечение поручений с цитатами-доказательствами
- self-hosted GPU inference
- idempotent job coordination
- PDF export
- human-in-the-loop утверждение
Особенности
Приватность: записи не уходят во внешние AI-сервисы, инференс идёт на своём GPU-сервере по внутреннему контракту. Неизвестные ответственный и срок не заполняются догадкой. Много внимания надёжности бэкенда: восстановление после перезапуска, очистка временного аудио, tombstones при удалении. Модели и GPU worker лежат вне репозитория. Стартовый каркас создан 22.09, логика совещаний — 23.09.
Стек
Python · FastAPI · uv · Next.js · React · TypeScript · SCSS · Supabase Auth · ffmpeg · GitHub Actions
Модели
локальные модели на NVIDIA inference API (не названы)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-ef3da0e3-aib2bsaassixseven.
README
README.mdTirke — протокол совещания с проверяемыми поручениями
Коротко о проекте: Tirke превращает запись совещания в черновик протокола с цитатами и таймкодами. Человек сверяет его с записью, исправляет поручения и только затем утверждает PDF.
Сравнение с обычным протоколом: в анимации показано, как детали теряются в протоколе и как Tirke помогает проверить их по исходной записи. Нажмите на превью, чтобы открыть полное видео (1:36).
Tirke (проект Hackalem) помогает подготовить протокол по готовой записи встречи на русском, казахском или смешанной речи. Целевой сценарий: загрузить аудио или видео, получить транскрипт со спикерами и таймкодами, проверить краткий итог и поручения по цитатам, исправить черновик, утвердить его и скачать PDF. Вывод модели всегда остаётся черновиком: неизвестные ответственный и срок не заполняются догадкой.
Браузер / Next.js → FastAPI → локальный NVIDIA inference API
↓ ↓
данные в data/ ← результат модели
↓
проверка человеком → утверждённый PDF
Аудио, видео, транскрипты и выводы модели не отправляются во внешние облачные AI или аналитические сервисы. Существующий Supabase используется для входа и профиля; данные встреч хранятся на диске backend приложения. При загрузке видео FastAPI локально извлекает первую аудиодорожку и передаёт на NVIDIA-сервер только аудио.
Возможности
| Возможность | Как устроено |
|---|---|
| Загрузка | Аудио WAV, MP3, M4A, OGG, WebM и видео MP4, MOV, MKV до 100 MiB. Backend проверяет формат по содержимому и локально извлекает аудиодорожку из видео. |
| Обработка | Асинхронный конвейер на выделенном NVIDIA-сервере команды: распознавание, разделение голосов и извлечение итогов и поручений. В интерфейсе видны статус и этап обработки. |
| Проверка | Транскрипт с таймкодами, краткий итог и поручения с цитатами. Пользователь исправляет текст, спикеров, ответственных и сроки, добавляет или удаляет поручения. |
| Результат | Правки сохраняются в data/ backend приложения. После утверждения текущей ревизии доступен PDF; новая правка снова требует утверждения. |
| Доступ | Supabase Auth определяет владельца, а FastAPI проверяет право доступа к каждой встрече и её PDF. Содержимое встреч не хранится в Supabase. |
NVIDIA inference API и модели запускаются отдельно от этого репозитория по внутреннему контракту. Приложению нужны адрес сервиса и серверный токен; браузер их не получает.
Запуск основного сценария
Нужны Node.js 22+, npm, Python 3.12+, uv, ffprobe и ffmpeg в PATH. Также нужны проект Supabase Auth и доступный NVIDIA inference API команды. Из корня репозитория:
cp frontend/.env.example frontend/.env.local
cp backend/.env.example backend/.env
npm --prefix frontend ci
uv sync --directory backend --locked --all-groups
В frontend/.env.local задайте реальные NEXT_PUBLIC_SUPABASE_URL и NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY. В backend/.env укажите тот же проект через SUPABASE_URL и SUPABASE_PUBLISHABLE_KEY, а также GPU_API_URL и GPU_API_TOKEN развёрнутого командой аутентифицированного inference HTTP API. FRONTEND_ORIGIN должен совпадать с адресом frontend (по умолчанию http://localhost:3000), NEXT_PUBLIC_API_URL — указывать на FastAPI (по умолчанию http://localhost:8000). Токен GPU хранится только на backend и не помещается в NEXT_PUBLIC_*.
Запустите API и frontend в двух терминалах:
uv run --directory backend fastapi dev app/main.py --port 8000
npm --prefix frontend run dev
Откройте http://localhost:3000/login, войдите в аккаунт и создайте встречу. Загрузите запись, дождитесь статуса review_required, проверьте транскрипт и поручения по цитатам, сохраните правки, утвердите результат и скачайте PDF. Повторное открытие встречи показывает сохранённую версию. API доступен на http://localhost:8000/docs, проверка состояния — на http://localhost:8000/health.
Backend добавляет к GPU_API_URL маршруты /internal/v1/jobs и другие пути контракта. Между приложением и NVIDIA-сервером используйте HTTPS или защищённый туннель. Ссылки на Jupyter и SSH не заменяют адрес inference API. Без GPU-настроек сохранённые встречи доступны, а новые ожидают обработки.
DATA_ROOT=data означает приватный каталог backend/data при таком запуске; для другой рабочей директории задайте абсолютный путь. Не коммитьте .env, записи, транскрипты, PDF, веса моделей и реальные персональные данные. Подробности: backend/README.md и frontend/README.md.
Развёртывание приложения
Ниже — запуск Next.js и FastAPI на одной машине без Docker. Для обработки новых записей отдельно нужен уже работающий NVIDIA inference API команды, реализующий внутренний контракт. Этот репозиторий не развёртывает GPU worker или модель. Внешние AI API для записей не используются.
-
Подготовьте сервер с Node.js 22+, npm, Python 3.12+,
uv,ffprobeиffmpeg. Разместите репозиторий на сервере и выделите постоянный приватный каталог дляDATA_ROOT, доступный на запись пользователю FastAPI. Сохраняйте его между обновлениями приложения: там находятся результаты, правки, PDF и временное аудио. При резервном копировании исключайте временные загрузки, чтобы не сохранять аудио дольше установленного срока очистки. -
Создайте
frontend/.env.localизfrontend/.env.exampleиbackend/.envизbackend/.env.example. Настройте адреса до сборки frontend, посколькуNEXT_PUBLIC_*попадают в клиентскую сборку. Например, при разных HTTPS-адресах сайта и API:# frontend/.env.local NEXT_PUBLIC_SITE_URL=https://tirke.example.org NEXT_PUBLIC_API_URL=https://api.tirke.example.org NEXT_PUBLIC_SUPABASE_URL=https://YOUR_PROJECT.supabase.co NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_KEY # backend/.env FRONTEND_ORIGIN=https://tirke.example.org SUPABASE_URL=https://YOUR_PROJECT.supabase.co SUPABASE_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_KEY DATA_ROOT=/path/to/private/persistent/data GPU_API_URL=https://YOUR_INTERNAL_INFERENCE_API GPU_API_TOKEN=YOUR_SERVICE_TOKENИспользуйте один и тот же проект Supabase в обоих файлах. Примените миграцию профилей к этому проекту и разрешите в настройках Supabase Auth адрес
https://tirke.example.org/auth/confirmдля подтверждения регистрации.GPU_API_URLдоступен с машины FastAPI по HTTPS или защищённому туннелю; токен остаётся только вbackend/.env. Вариант SSH-туннеля описан в backend/README.md.FRONTEND_ORIGIN— точный origin браузерного сайта без пути и завершающего/. URL API должен быть доступен браузеру; клиент сам добавит/api/v1. -
Установите зависимости и соберите frontend из корня репозитория:
npm --prefix frontend ci uv sync --directory backend --locked --no-dev npm --prefix frontend run build -
Запустите по одному процессу FastAPI и Next.js под менеджером процессов вашей машины, чтобы они поднимались после перезагрузки. Следующие команды показывают сами процессы; запускайте их из корня репозитория:
uv run --directory backend --no-dev fastapi run app/main.py --host 127.0.0.1 --port 8000 npm --prefix frontend run start -- --hostname 127.0.0.1 --port 3000HTTPS reverse proxy направляет адрес сайта на
127.0.0.1:3000, адрес API — на127.0.0.1:8000. Разрешите в прокси загрузку файлов до 100 MiB и не публикуйтеDATA_ROOTкак статические файлы. После измененияNEXT_PUBLIC_*пересоберите frontend и перезапустите его; после измененияbackend/.envперезапустите FastAPI. -
Проверьте
https://api.tirke.example.org/health, затем войдите через сайт и загрузите разрешённую тестовую запись.healthподтверждает работу приложения, но не готовность GPU worker: успешный реальный сценарий заканчивается статусомreview_required, проверкой и скачиванием PDF после утверждения. Без настроенного inference API новые встречи не получают результата; демо-режим ниже работает независимо от него.
Демо без внешних сервисов
Для быстрого просмотра интерфейса достаточно установить frontend-зависимости и запустить npm --prefix frontend run dev. На странице входа выберите Continue in demo mode: можно пройти создание встречи, имитацию обработки, проверку и утверждение. Демо использует синтетические данные в памяти браузера, не распознаёт выбранный файл и сбрасывается после перезагрузки рабочего пространства. Кнопка Download PDF в демо открывает печать браузера; основной сценарий скачивает PDF с FastAPI. Системные надписи интерфейса сейчас на английском, а содержимое встречи может быть на русском и казахском.
Основной сценарий и технические границы
- Авторизованный пользователь отправляет
POST /api/v1/meetings: файл до 100 MiB и metadata. Принимаются WAV, MP3, M4A, OGG, WebM, MP4, MOV и MKV; backend проверяет содержимое, а у видео локально извлекает первую аудиодорожку. - FastAPI сохраняет временное аудио и manifest в
DATA_ROOT, возвращает202 queued. Координатор отправляет задачу по ключуmeeting_id:attempt, отслеживает этапы и может продолжить работу после перезапуска. - При готовности backend проверяет версионированный результат, сегменты и ссылки поручений на доказательства, атомарно сохраняет JSON/TXT и только затем подтверждает приём GPU-сервису. Временные копии удаляются после подтверждения или по сроку хранения; результаты и правки остаются локально.
- Пользователь проверяет транскрипт, спикеров, итог и поручения. Для каждого извлечённого поручения сохраняются цитата, таймкод, ID сегмента и метаданные запуска модели. Неустановленные ответственный и срок видны как пустые поля.
- После явного утверждения FastAPI формирует PDF из текущей сохранённой ревизии. Новая правка возвращает встречу в
review_requiredи делает прежний PDF недействительным.
Публичные статусы: queued, processing, review_required, approved, failed. Детальный HTTP-контракт, ошибки и внутренний GPU-протокол описаны в API_CONTRACT.md. Веб-клиент не обращается к NVIDIA или файлам data/ напрямую. Для данных встречи не требуются PostgreSQL, Redis, Docker и объектное хранилище.
Проверка и воспроизводимость
После установки зависимостей запустите из корня репозитория:
npm --prefix frontend run lint
npm --prefix frontend run typecheck
npm --prefix frontend run test
npm --prefix frontend run build
uv run --directory backend pytest -q
uv run --directory backend ruff check .
uv run --directory backend pyright
Backend-тесты используют синтетические записи и fake GPU: они проверяют маршруты, права владельца, сохранение, повторы, очистку, проверку и PDF, но не измеряют распознавание или диаризацию. Для демонстрации реального AI нужны согласованные записи RU, KK и mixed, развёрнутый NVIDIA worker и ручная проверка результата по плану ML-оценки. Синтетический fixture нельзя выдавать за вывод модели. Сценарий показа и критерии приёмки описывают полный целевой прогон.
Структура проекта
frontend/ Next.js 16, TypeScript, Sass, TanStack Query, Zod
backend/app/api/ FastAPI routes и авторизация
backend/app/services/ загрузка, coordinator, хранение, review и PDF
backend/tests/ контрактные и интеграционные тесты с fake GPU
supabase/ существующий Auth/profile, без данных встреч
docs/product/ PRD и сценарий демонстрации
docs/technical/ TRD, архитектура, API-контракт и ML-оценка
docs/design-references/ визуальные референсы, не требования к поведению
Дальнейшее развитие
При развитии продукта команда планирует улучшать качество RU/KK/mixed распознавания на размеченном наборе записей, навигацию по цитатам, повторную обработку с сохранением правок и настройку PDF. Запись на сайте, интеграции с календарями и трекерами, совместная проверка и масштабирование хранения описаны как следующие этапы в PRD.
Источники требований: PRD, TRD, архитектура, правила репозитория.
Авторы коммитов
История коммитов
- 2026-09-23 17:57Show project comparison preview in READMEyernururue
- 2026-09-23 17:53Link comparison video in READMEyernururue
- 2026-09-23 17:52finalyernururue
- 2026-09-23 17:51Connect live meeting review and NVIDIA tunnel setupyernururue
- 2026-09-23 17:30feat: connect meeting workflow to backendvlat
- 2026-09-23 17:26docs: update meeting intelligence MVP planyernururue
- 2026-09-23 17:13test(ml): preserve synthetic audit reproduction fixturesrodnoika
- 2026-09-23 17:12docs(ml): record pipeline audit and reliability improvement planrodnoika
Все коммиты (69)
- 2026-09-23 17:11feat(ml): add offline meeting pipeline with evidence validationrodnoika
- 2026-09-23 17:11build(ml): pin optional offline inference dependenciesrodnoika
- 2026-09-23 17:09Merge branch 'vlad-frontend'vlat
- 2026-09-23 17:08Merge remote-tracking branch 'origin/main' into vlad-frontendvlat
- 2026-09-23 17:08feat(frontend): refresh meeting experiencevlat
- 2026-09-23 17:05Merge pull request #7 from BAITC-Hacks/vlad-frontendYernur
- 2026-09-23 17:04Merge branch 'main' into vlad-frontendYernur
- 2026-09-23 16:57Merge pull request #6 from BAITC-Hacks/codex/browser-meeting-recordingYernur
- 2026-09-23 16:51Merge P0 backend into browser recording branchyernururue
- 2026-09-23 16:50Keep README status independent of commit hashyernururue
- 2026-09-23 16:49Merge latest MVP backend into README branchyernururue
- 2026-09-23 16:48Document Hackalem MVP status and reproducible setupyernururue
- 2026-09-23 16:46feat: add browser tab meeting recording pathyernururue
- 2026-09-23 16:42Merge pull request #5 from BAITC-Hacks/codex/meeting-mvp-stage45Yernur
- 2026-09-23 16:35Trim whitespace in bundled font licenseyernururue
- 2026-09-23 16:34Render approved Unicode meeting PDFsyernururue
- 2026-09-23 16:34Integrate review API and race-safe PDF exportyernururue
- 2026-09-23 16:33Add synthetic end-to-end acceptance and honest demo fixtureyernururue
- 2026-09-23 16:33Add durable revisioned review and approval serviceyernururue
- 2026-09-23 16:21Merge branch 'codex/browser-recording-prompt' into codex/integrate-ready-20260923yernururue
- 2026-09-23 16:21Merge branch 'codex/meeting-mvp' into codex/integrate-ready-20260923yernururue
- 2026-09-23 16:17Document backend stage 3 handoffyernururue
- 2026-09-23 16:15Close stage 3 recovery and cleanup racesyernururue
- 2026-09-23 16:07docs: add browser meeting recording implementation promptyernururue
- 2026-09-23 16:07Merge branch 'chore-project-set-up' into vlad-frontendvlat
- 2026-09-23 16:06Recover uncertain GPU submissions by idempotency keyyernururue
- 2026-09-23 16:02Reconcile pending GPU cleanup across failed attemptsyernururue
- 2026-09-23 15:56Save local changesvlat
- 2026-09-23 15:55Coordinate lifecycle mutations with background processingyernururue
- 2026-09-23 15:54Merge pull request #4 from BAITC-Hacks/chore-project-set-upvladislav
- 2026-09-23 15:52feat: add pointer interaction and update fragment shader rendering logicvlat
- 2026-09-23 15:51Sweep expired local meeting data and deletion tombstonesyernururue
- 2026-09-23 15:47Serialize coordinator ticks across processes and isolate corrupt meetingsyernururue
- 2026-09-23 15:46Add owner-scoped retry and meeting deletionyernururue
- 2026-09-23 15:42Run durable meeting coordinator in FastAPI lifespanyernururue
- 2026-09-23 15:36Merge pull request #3 from BAITC-Hacks/chore-project-set-upvladislav
- 2026-09-23 15:35feat: coordinate durable meeting result publication and cleanupyernururue
- 2026-09-23 15:35feat: add Supabase auth, workspace UI views, and rebrand project to Tirkevlat
- 2026-09-23 15:27Add typed authenticated GPU HTTP clientyernururue
- 2026-09-23 15:22Keep meeting creation invisible on upload faultsyernururue
- 2026-09-23 15:16Implement public meeting upload and read APIyernururue
- 2026-09-23 15:07fix: enforce artifact durability and validate raw bundle hashesyernururue
- 2026-09-23 15:03feat: add validated meeting models and durable local artifact storeyernururue
- 2026-09-23 14:55docs: align implementation plan with result contractyernururue
- 2026-09-23 14:53docs: align meeting result and GPU lifecycle contractsyernururue
- 2026-09-23 14:47docs: add meeting intelligence MVP implementation planyernururue
- 2026-09-23 14:47refactor: reorganize frontend feature architecture, Sass styling, and product documentationvlat
- 2026-09-23 14:13Merge pull request #1 from BAITC-Hacks/yernur-backendYernur
- 2026-09-23 14:07refactor: restructure project directory to use src layout and workspace routingvlat
- 2026-09-23 14:06docs: move inference to team NVIDIA serveryernururue
- 2026-09-23 13:58docs: define meeting intelligence MVPyernururue
- 2026-09-23 13:31Merge hackathon starter into mainrodnoika
- 2026-09-23 13:00initialrodnoika
- 2026-09-22 23:29feat: add profile schema and RLSrodnoika
- 2026-09-22 23:17feat: add protected hackathon dashboardrodnoika
- 2026-09-22 22:51feat: add Supabase SSR authenticationrodnoika
- 2026-09-22 22:32feat: add RLS-aware profile endpointrodnoika
- 2026-09-22 22:28feat: verify Supabase access tokensrodnoika
- 2026-09-22 22:23feat: scaffold FastAPI servicerodnoika
- 2026-09-22 22:14docs: plan hackathon starter implementationrodnoika
- 2026-09-22 22:07docs: define hackathon starter architecturerodnoika
Структура репозитория (183 файлов)
.env.example .github/workflows/ci.yml .gitignore AGENTS.md README.md backend/.env.example backend/README.md backend/app/__init__.py backend/app/api/__init__.py backend/app/api/router.py backend/app/api/routes/__init__.py backend/app/api/routes/health.py backend/app/api/routes/me.py backend/app/api/routes/meetings.py backend/app/core/__init__.py backend/app/core/auth.py backend/app/core/config.py backend/app/main.py backend/app/models/__init__.py backend/app/models/gpu.py backend/app/models/insights.py backend/app/models/meeting.py backend/app/models/profile.py backend/app/models/transcript.py backend/app/services/__init__.py backend/app/services/artifact_store.py backend/app/services/coordinator.py backend/app/services/coordinator_runtime.py backend/app/services/demo_fixture.py backend/app/services/fonts/NotoSans.ttf backend/app/services/fonts/OFL.txt backend/app/services/gpu_client.py backend/app/services/lifecycle.py backend/app/services/local_janitor.py backend/app/services/pdf_export.py backend/app/services/pipeline_result_adapter.py backend/app/services/profiles.py backend/app/services/reviews.py backend/app/services/uploads.py backend/pyproject.toml backend/scripts/gpu-ssh-tunnel.sh backend/tests/conftest.py backend/tests/fixtures/browser-recording.webm backend/tests/fixtures/demo_meeting/README.md backend/tests/fixtures/demo_meeting/synthetic.json backend/tests/fixtures/matroska-opus.mkv backend/tests/fixtures/upload.m4a backend/tests/fixtures/upload.mp3 backend/tests/fixtures/upload.ogg backend/tests/fixtures/webm-vorbis.webm backend/tests/test_artifact_store.py backend/tests/test_auth.py backend/tests/test_config.py backend/tests/test_coordinator.py backend/tests/test_coordinator_runtime.py backend/tests/test_gpu_client.py backend/tests/test_health.py backend/tests/test_lifecycle.py backend/tests/test_local_janitor.py backend/tests/test_meeting_flow.py backend/tests/test_meetings_api.py backend/tests/test_pdf_export.py backend/tests/test_pipeline_result_adapter.py backend/tests/test_profiles.py backend/tests/test_review_routes.py backend/tests/test_reviews.py backend/uv.lock docs/README.md docs/design-references/01-new-meeting-wireframe.png docs/design-references/02-navigation-wireframe.png docs/design-references/03-workflow-notes.png docs/design-references/04-dark-dashboard-reference.png docs/design-references/README.md docs/product/DEMO_FLOW.md docs/product/PRD.md docs/product/TARGET_USERS.md docs/superpowers/handoffs/2026-09-23-browser-recording.md docs/superpowers/handoffs/2026-09-23-stage-3.md docs/superpowers/plans/2026-09-22-hackathon-starter.md docs/superpowers/plans/2026-09-23-meeting-intelligence-mvp.md docs/superpowers/prompts/browser-meeting-recording.md docs/superpowers/specs/2026-09-22-hackathon-starter-design.md docs/superpowers/specs/2026-09-23-meeting-intelligence-mvp-design.md docs/technical/API_CONTRACT.md docs/technical/ARCHITECTURE.md docs/technical/ML_EVALUATION.md docs/technical/TRD.md frontend/.env.example frontend/.gitignore frontend/AGENTS.md frontend/README.md frontend/eslint.config.mjs frontend/next.config.ts frontend/package-lock.json frontend/package.json frontend/public/favicon.png frontend/src/app/(auth)/login/page.module.scss frontend/src/app/(auth)/login/page.tsx frontend/src/app/(workspace)/dashboard/page.tsx frontend/src/app/(workspace)/layout.tsx frontend/src/app/(workspace)/meetings/[meetingId]/page.tsx frontend/src/app/(workspace)/meetings/new/page.tsx frontend/src/app/(workspace)/meetings/page.tsx frontend/src/app/(workspace)/settings/page.tsx frontend/src/app/(workspace)/tasks/page.tsx frontend/src/app/auth/confirm/route.ts frontend/src/app/globals.scss frontend/src/app/layout.tsx frontend/src/app/page.module.scss frontend/src/app/page.tsx frontend/src/components/layout/app-shell.module.scss frontend/src/components/layout/app-shell.tsx frontend/src/components/layout/header-navigation.tsx frontend/src/components/layout/site-header.module.scss frontend/src/components/layout/site-header.tsx frontend/src/components/providers/app-providers.tsx frontend/src/components/ui/button-link.module.scss frontend/src/components/ui/button-link.tsx frontend/src/components/ui/page-header.module.scss frontend/src/components/ui/page-header.tsx frontend/src/features/assignments/index.ts frontend/src/features/assignments/model/assignment.test.ts frontend/src/features/assignments/model/assignment.ts frontend/src/features/assignments/ui/tasks-view.module.scss frontend/src/features/assignments/ui/tasks-view.tsx frontend/src/features/auth/actions.ts frontend/src/features/auth/model/auth-state.ts frontend/src/features/auth/server/get-viewer.ts frontend/src/features/auth/ui/auth-form.module.scss frontend/src/features/auth/ui/auth-form.tsx frontend/src/features/dashboard/ui/dashboard-view.module.scss frontend/src/features/dashboard/ui/dashboard-view.test.tsx frontend/src/features/dashboard/ui/dashboard-view.tsx frontend/src/features/demo-workspace/demo-workspace-provider.tsx frontend/src/features/demo-workspace/lib/format.test.ts frontend/src/features/demo-workspace/lib/format.ts frontend/src/features/demo-workspace/model/demo-data.ts frontend/src/features/demo-workspace/ui/workspace-header.module.scss frontend/src/features/demo-workspace/ui/workspace-header.test.tsx frontend/src/features/demo-workspace/ui/workspace-header.tsx frontend/src/features/landing/components/dithered-shader.module.scss frontend/src/features/landing/components/dithered-shader.tsx frontend/src/features/meetings/api/client.test.ts frontend/src/features/meetings/api/client.ts frontend/src/features/meetings/api/hooks.ts frontend/src/features/meetings/api/index.ts frontend/src/features/meetings/api/schemas.ts frontend/src/features/meetings/index.ts frontend/src/features/meetings/model/meeting.test.ts frontend/src/features/meetings/model/meeting.ts frontend/src/features/meetings/ui/live-meeting-detail-view.tsx frontend/src/features/meetings/ui/meeting-detail-view.module.scss frontend/src/features/meetings/ui/meeting-detail-view.test.tsx frontend/src/features/meetings/ui/meeting-detail-view.tsx frontend/src/features/meetings/ui/meetings-view.module.scss frontend/src/features/meetings/ui/meetings-view.test.tsx frontend/src/features/meetings/ui/meetings-view.tsx frontend/src/features/meetings/ui/new-meeting-modal.module.scss frontend/src/features/meetings/ui/new-meeting-modal.test.tsx frontend/src/features/meetings/ui/new-meeting-modal.tsx frontend/src/features/profile/ui/settings-view.module.scss frontend/src/features/profile/ui/settings-view.tsx frontend/src/lib/api/http-client.ts frontend/src/lib/config/public-env.ts frontend/src/lib/supabase/access-token.test.ts frontend/src/lib/supabase/access-token.ts frontend/src/lib/supabase/client.ts frontend/src/lib/supabase/proxy.ts frontend/src/lib/supabase/server.ts frontend/src/proxy.ts frontend/src/styles/_tokens.scss frontend/src/test/setup.ts frontend/tsconfig.json frontend/vitest.config.ts meeting-1-manim.mp4 meeting-1-preview.gif package.json scripts/dev.ps1 scripts/dev.sh supabase/.gitignore supabase/config.toml supabase/migrations/20260922000000_create_profiles.sql supabase/tests/profiles_rls.sql
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.
