AAYMA
RU
Войти

Tirke

Веб-сервис: по аудио или видео совещания строится транскрипт со спикерами и таймкодами, краткий итог и поручения с цитатами.

Рабочий MVP
Команда «AIB2BSaaSSixSeven» 19💬 0 комментариевс 22 сентября 2026 г.

О проекте

Команда: 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.md

Tirke — протокол совещания с проверяемыми поручениями

Коротко о проекте: Tirke превращает запись совещания в черновик протокола с цитатами и таймкодами. Человек сверяет его с записью, исправляет поручения и только затем утверждает PDF.

Сравнение с обычным протоколом: в анимации показано, как детали теряются в протоколе и как Tirke помогает проверить их по исходной записи. Нажмите на превью, чтобы открыть полное видео (1:36).

Анимация: сравнение обычного протокола с проверкой записи и поручений в Tirke

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 для записей не используются.

  1. Подготовьте сервер с Node.js 22+, npm, Python 3.12+, uv, ffprobe и ffmpeg. Разместите репозиторий на сервере и выделите постоянный приватный каталог для DATA_ROOT, доступный на запись пользователю FastAPI. Сохраняйте его между обновлениями приложения: там находятся результаты, правки, PDF и временное аудио. При резервном копировании исключайте временные загрузки, чтобы не сохранять аудио дольше установленного срока очистки.

  2. Создайте 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.

  3. Установите зависимости и соберите frontend из корня репозитория:

    npm --prefix frontend ci
    uv sync --directory backend --locked --no-dev
    npm --prefix frontend run build
    
  4. Запустите по одному процессу 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 3000
    

    HTTPS reverse proxy направляет адрес сайта на 127.0.0.1:3000, адрес API — на 127.0.0.1:8000. Разрешите в прокси загрузку файлов до 100 MiB и не публикуйте DATA_ROOT как статические файлы. После изменения NEXT_PUBLIC_* пересоберите frontend и перезапустите его; после изменения backend/.env перезапустите FastAPI.

  5. Проверьте 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. Системные надписи интерфейса сейчас на английском, а содержимое встречи может быть на русском и казахском.

Основной сценарий и технические границы

  1. Авторизованный пользователь отправляет POST /api/v1/meetings: файл до 100 MiB и metadata. Принимаются WAV, MP3, M4A, OGG, WebM, MP4, MOV и MKV; backend проверяет содержимое, а у видео локально извлекает первую аудиодорожку.
  2. FastAPI сохраняет временное аудио и manifest в DATA_ROOT, возвращает 202 queued. Координатор отправляет задачу по ключу meeting_id:attempt, отслеживает этапы и может продолжить работу после перезапуска.
  3. При готовности backend проверяет версионированный результат, сегменты и ссылки поручений на доказательства, атомарно сохраняет JSON/TXT и только затем подтверждает приём GPU-сервису. Временные копии удаляются после подтверждения или по сроку хранения; результаты и правки остаются локально.
  4. Пользователь проверяет транскрипт, спикеров, итог и поручения. Для каждого извлечённого поручения сохраняются цитата, таймкод, ID сегмента и метаданные запуска модели. Неустановленные ответственный и срок видны как пустые поля.
  5. После явного утверждения 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, архитектура, правила репозитория.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
69
Авторы
3
Файлы
183
Ветки
9

Авторы коммитов

yernururue 43rodnoika 14vlat 12

История коммитов

  • 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
Ветки (9)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.