AAYMA
RU
Войти

Oqucat

Полнофункциональный full-stack шаблон (авторизация, чаты, push, PWA/Tauri) с добавленным кабинетом бизнеса, где создаются карточки задач с…

Прототип
Команда «DavDev» 3💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: DavDev
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Прототип

Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд

Суть

Полнофункциональный full-stack шаблон (авторизация, чаты, push, PWA/Tauri) с добавленным кабинетом бизнеса, где создаются карточки задач с AI-ассистентом, уточняющими вопросами и оценкой готовности.

Как устроено

React 19-клиент и Express 5/Socket.IO-сервер с PostgreSQL (Sequelize), Better Auth (OAuth, passkeys, TOTP), Firebase и Telegram-уведомлениями. По README и коммитам (add cards funcs, filtering by tags) добавлены карточки бизнеса: ручное заполнение, текстовый AI-ассистент и голосовой ввод, уточняющие вопросы, дополнительные поля, оценка готовности и подтверждение публикации. Конкретная LLM и логика оценки в карточке не описаны.

Ключевые решения

  • AI-ассистент заполнения карточки
  • голосовой ввод
  • оценка готовности
  • фильтрация по тегам
  • чаты реального времени

Особенности

Большая часть кода и README посвящена инфраструктуре шаблона (passkeys, 2FA, Android-сборка на Tauri, push), а функциональность кейса описана одним абзацем; разделы «Что делает проект?» и «Ссылка на развернутую версию» пустые.

Стек

TypeScript · React 19 · Express 5 · Socket.IO · PostgreSQL · Sequelize · Better Auth · MUI · Tailwind CSS · Three.js · Tauri 2 · Rust · Firebase · PWA


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-668e93ac-davdev.

README

README.md

Что делает проект?

Что реализовано?

  • Полноценное клиент-серверное приложение: отдельные React-клиент и TypeScript/Express-сервер, объединённые REST API и WebSocket-каналом.
  • Современная интерактивная landing-страница с плавной прокруткой, прогрессом просмотра, кастомным курсором и выразительными 2D/3D-визуальными эффектами.
  • Авторизация по электронной почте и паролю с обязательным подтверждением email, восстановлением пароля и автоматической отправкой локализованных писем.
  • OAuth-вход через Google, Facebook и GitHub, а также авторизация и привязка аккаунта через Telegram.
  • Безопасная аутентификация без пароля через passkeys/WebAuthn с управлением зарегистрированными ключами.
  • Двухфакторная аутентификация TOTP: подключение через QR-код, ручной секрет, проверка кода и генерация резервных кодов восстановления.
  • Управление активными сессиями и связанными OAuth-аккаунтами из профиля пользователя.
  • Защита регистрации и входа: Cloudflare Turnstile, проверка скомпрометированных паролей через Have I Been Pwned, rate limiting, замедление подозрительных запросов, Helmet, CORS и серверная валидация Zod.
  • Ролевая модель с пользовательским и супер-административным доступом; защищённые маршруты и отдельная панель управления для супер-администратора.
  • Чаты реального времени с сохранением сообщений в PostgreSQL, списком диалогов, счётчиками непрочитанных сообщений, статусами online/offline, индикатором набора текста, прочтением сообщений и URL-навигацией к диалогу.
  • Умная доставка сообщений: если получатель не подключён, сообщение дополнительно отправляется через Firebase Push и Telegram при наличии привязанного Telegram-аккаунта.
  • Push-уведомления для веб-приложения и Android: запрос разрешений, регистрация устройств, Service Worker для Web Push и нативный мост Tauri/FCM.
  • Панель супер-администратора для отправки адресных push-уведомлений конкретному пользователю.
  • Профиль пользователя с изменением имени и аватара, автоматической оптимизацией изображений в WebP, а также выбором языка и часового пояса с мгновенным сохранением изменений в базе данных.
  • Приложение полностью локализовано на три языка — русский, английский и казахский — с автоматическим определением языка браузера; локализованы также системные письма и уведомления.
  • Встроенный Monaco Editor с подсветкой синтаксиса и переключением JavaScript, TypeScript, Python, JSON, HTML и CSS; поддерживаются светлая и тёмная темы.
  • Адаптивный интерфейс для мобильных и настольных экранов, единая система уведомлений и обработка ошибок на клиенте.
  • Установка как PWA с автообновлением и offline-ready инфраструктурой Workbox.
  • Нативная оболочка на Tauri 2 для desktop и Android, включая нативный вход через Google и системные push-уведомления.
  • Серверная работа с PostgreSQL через Sequelize: автоматическая проверка и создание базы данных, типизированные модели пользователей, аккаунтов, сессий, passkeys, 2FA, сообщений и push-установок.
  • Модульная серверная архитектура с отдельными доменами авторизации, пользователей, чатов, уведомлений, email и Telegram; статика аватаров и API защищены middleware.
  • Локализованные email-шаблоны для подтверждения адреса, сброса пароля, регистрации администратора и других системных сценариев.
  • Начальное создание root-супер-администратора и поддержка безопасной cookie-сессии между клиентом, REST API и WebSocket.

Используемые технологии и архитектура

  • Клиент: TypeScript, React 19, React Router, Vite Plus/Vite и Node.js 24+.
  • Интерфейс: MUI, Emotion, Tailwind CSS, Roboto, GSAP и Motion; для визуализаций используются Three.js, React Three Fiber и Rapier.
  • Управление состоянием и данными: TanStack React Query; HTTP-запросы выполняются через Axios, обмен сообщениями в реальном времени — через Socket.IO Client.
  • Интернационализация: i18next с определением языка в браузере; поддерживаются русская, английская и казахская локали.
  • Клиент собирается как веб-приложение и PWA с Vite PWA/Workbox. Для нативных сборок используется Tauri 2 с Rust, включая Android.
  • Сервер: TypeScript, Node.js 24+, Express 5 и Socket.IO. Код разделён на модули авторизации, пользователей, чатов, уведомлений, электронной почты и Telegram-бота.
  • Авторизация: Better Auth с поддержкой входа по почте и паролю, OAuth-интеграций, двухфакторной аутентификации и passkeys; сервер дополнительно использует Helmet, CORS, ограничение частоты запросов и валидацию через Zod.
  • Данные: PostgreSQL, Sequelize и sequelize-typescript. Модели пользователей, аккаунтов, сессий, passkeys, двухфакторной аутентификации, подтверждений, сообщений и push-установок хранятся в базе данных.
  • Взаимодействие между слоями: клиент обращается к серверу по REST API с cookie-сессией и по WebSocket через Socket.IO; сервер отдаёт статические ресурсы и обрабатывает фоновые задачи через node-cron.
  • Внешние интеграции: Firebase для push-уведомлений, Telegram Bot API через Grammy, отправка почты через Nodemailer и работа с изображениями через Sharp.
  • Репозиторий разделён на независимые приложения oqucat-client и oqucat-server; для установки и сборки используется pnpm 12.

Среда разработки и инструменты

  • Разработка ведётся в VSCodium на Node.js 24+ с использованием pnpm 12. Для проекта используются TypeScript 7, tsc для строгой проверки типов и сборки, tsx для запуска TypeScript в разработке, Vite Plus/Vite для dev-сервера и сборки, а также esbuild для production-сборки сервера.
  • Инструменты качества кода из экосистемы OXC: oxlint и oxlint-tsgolint для быстрого статического анализа TypeScript/JavaScript, oxfmt для форматирования, @oxc-node/cli и единые команды lint, fmt, typecheck и fix в обоих приложениях.
  • Полезные расширения VSCodium: OXC, Tailwind CSS IntelliSense, Tauri, ES7 React/Redux/GraphQL snippets, GitLens, Error Lens, I18n Ally, DB Client, Draw.io с поддержкой Mermaid, Material Icon и Material Product Icons.
  • Настроены кастомные сниппеты под стек проекта, ускоряющие разработку компонентов и типовых модулей на React, UI-элементов MUI и моделей/связей Sequelize.
  • MUI Icons Lookup — собственное расширение, разработанное автором проекта для быстрого поиска и подбора иконок MUI.
  • В репозитории предусмотрены Git-хуки: prepare-commit-msg проверяет формат Conventional Commits (feat, fix, refactor, docs, test, build, ci, chore, perf, revert), а pre-commit для изменённого приложения запускает форматирование, lint:fix и проверку типов. После успешной проверки версия пакета автоматически увеличивается: для feat — minor-релиз, для остальных типов — patch-релиз, после чего изменённый package.json добавляется в commit.

Порядок установки и запуска

Требования: Node.js 24+, pnpm 12 и доступный экземпляр PostgreSQL. Команды выполняются из соответствующего каталога приложения.

  1. Установить зависимости клиента и сервера:

    cd oqucat-client
    pnpm install
    
    cd ../oqucat-server
    pnpm install
    
  2. Создать файлы окружения в каждом приложении на основе .env.example:

    pnpm generate-envs
    

    Заполнить .env и .env.local необходимыми значениями: параметры PostgreSQL, адреса клиента и сервера, ключи Better Auth, OAuth, Firebase, Telegram, Cloudflare и LLM. Файл .env предназначен для разработки через прокси-туннель, .env.local — для полностью локального запуска.

  3. Для разработки через dev.oqucat.dav-dev.kz:

    • настроить в PuTTY SSH-туннель, который проксирует локальные порты приложений на домен dev.oqucat.dav-dev.kz;

    • в одном терминале запустить сервер:

      cd oqucat-server
      pnpm dev
      
    • в другом терминале запустить клиент:

      cd oqucat-client
      pnpm dev
      

    Скрипт dev использует .env и рассчитан на доступ к приложению через dev.oqucat.dav-dev.kz.

  4. Для полностью локальной разработки на localhost запустить оба приложения с профилем local:

    В одном терминале:

    cd oqucat-server
    pnpm dev:local
    

    В другом терминале:

    cd oqucat-client
    pnpm dev:local
    

    Скрипт dev:local использует .env.local; прокси-туннель и домен dev.oqucat.dav-dev.kz не требуются.

  5. Для проверки production-сборки выполнить в каждом приложении:

    cd oqucat-server
    pnpm build
    
    cd ../oqucat-client
    pnpm build
    

    Клиент после сборки можно предварительно просмотреть командой pnpm preview. Для публикации предусмотрены команды pnpm sync: клиент передаёт сборку на сервер, а сервер загружает собранный файл и перезапускает приложение через PM2.

  6. Установка и запуск Android-версии:

    • установить JVM 21;

    • установить зависимости Tauri для Android по официальному руководству;

    • из каталога oqucat-client инициализировать Android-проект:

      pnpm tauri:android:init
      
    • добавить src-tauri/gen/android/keystore.properties с параметрами ключа подписи:

      password=xxxxxx
      keyAlias=upload
      storeFile=C:\\upload-keystore.jks
      
    • добавить Firebase-файл src-tauri/gen/android/app/google-services.json;

    • добавить GitHub Packages credentials в %USERPROFILE%\.gradle\gradle.properties:

      gpr.user=github_username
      gpr.key=ghp_xxxxxxxxxxx
      

    Для запуска Android-версии в режиме разработки использовать pnpm tauri:android:dev, а для production-сборки — pnpm tauri:android:build. Дополнительные сведения также приведены в README клиента.

Пример проверки

Создание карточек доступно в кабинете бизнеса, вкладка «Мои карточки». Поддерживаются ручное заполнение, текстовый AI-ассистент и голосовой ввод, уточняющие вопросы, дополнительные поля, оценка готовности и подтверждение публикации. Команды проверки, контракт API и сценарий демонстрации описаны в инструкции проверки карточек.

Используемые данные и внешние сервисы

Известные ограничения

Ссылка на развернутую версию

TODO

  • Реализовать клиентское веб-приложение.
  • Реализовать серверное приложение с базой данных.
  • Добавить авторизацию по почте и паролю, OAuth, 2FA и passkeys.
  • Добавить чаты реального времени.
  • Подготовить PWA-версию приложения.
  • Подготовить нативную оболочку приложения на Tauri.
  • Разместить стабильную веб-версию на публичном сайте.
  • Опубликовать приложение в Google Play.
  • Опубликовать приложение в App Store.
  • Настроить автоматическую сборку и публикацию релизов.
  • Добавить мониторинг, журналирование и уведомления о сбоях в production.
  • Подготовить пользовательскую и техническую документацию.
Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
24
Авторы
3
Файлы
586
Ветки
1

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

ratchet535 15JohnHysen 7Shurahell 2

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

  • 2026-09-23 17:57xratchet535
  • 2026-09-23 17:49Merge branch 'main' of https://github.com/BAITC-Hacks/hack-668e93ac-davdevratchet535
  • 2026-09-23 17:49xratchet535
  • 2026-09-23 17:41Merge branch 'main' of https://github.com/BAITC-Hacks/hack-668e93ac-davdevJohnHysen
  • 2026-09-23 17:41fix: card creation methodJohnHysen
  • 2026-09-23 17:37misc: readmeShurahell
  • 2026-09-23 17:33feat: add cards funcsJohnHysen
  • 2026-09-23 16:53Merge branch 'main' of https://github.com/BAITC-Hacks/hack-668e93ac-davdevJohnHysen
Все коммиты (24)
  • 2026-09-23 16:44xJohnHysen
  • 2026-09-23 16:41feat: add filtering by tags, chat listsratchet535
  • 2026-09-23 16:26feat: Rework tab selectorratchet535
  • 2026-09-23 16:11feat: Add unassigned roleratchet535
  • 2026-09-23 16:09fix: temporarily disable tgbot for dervratchet535
  • 2026-09-23 15:59fix: align icon, use lang names instd of codesratchet535
  • 2026-09-23 15:56fix: unify change langratchet535
  • 2026-09-23 15:47feat: landingJohnHysen
  • 2026-09-23 15:43feat: Added models for specific app functionalityratchet535
  • 2026-09-23 14:51misc: move ideas file to project rootratchet535
  • 2026-09-23 14:50misc: update ideasratchet535
  • 2026-09-23 14:44чratchet535
  • 2026-09-23 14:39misc: update ideasratchet535
  • 2026-09-23 14:11feat: add basic server functionalityJohnHysen
  • 2026-09-23 14:11feat: add base client templateShurahell
  • 2026-09-23 14:09feat: add repo layout, hooksratchet535
Структура репозитория (586 файлов)
.githooks/pre-commit
.githooks/prepare-commit-msg
IDEAS.md
README.md
oqucat-client/.agents/skills/better-auth-best-practices/SKILL.md
oqucat-client/.agents/skills/better-auth-security-best-practices/SKILL.md
oqucat-client/.agents/skills/create-auth/SKILL.md
oqucat-client/.agents/skills/email-and-password-best-practices/SKILL.md
oqucat-client/.agents/skills/find-skills/SKILL.md
oqucat-client/.agents/skills/gsap-core/SKILL.md
oqucat-client/.agents/skills/gsap-frameworks/SKILL.md
oqucat-client/.agents/skills/gsap-performance/SKILL.md
oqucat-client/.agents/skills/gsap-plugins/SKILL.md
oqucat-client/.agents/skills/gsap-react/SKILL.md
oqucat-client/.agents/skills/gsap-scrolltrigger/SKILL.md
oqucat-client/.agents/skills/gsap-timeline/SKILL.md
oqucat-client/.agents/skills/gsap-utils/SKILL.md
oqucat-client/.agents/skills/llms.txt
oqucat-client/.agents/skills/organization-best-practices/SKILL.md
oqucat-client/.agents/skills/two-factor-authentication-best-practices/SKILL.md
oqucat-client/.codex/config.toml
oqucat-client/.env.example
oqucat-client/.gitattributes
oqucat-client/.gitignore
oqucat-client/AGENTS.md
oqucat-client/README.md
oqucat-client/app-icon.png
oqucat-client/components.json
oqucat-client/index.html
oqucat-client/oxfmt.config.ts
oqucat-client/oxlint.config.ts
oqucat-client/package.json
oqucat-client/pnpm-lock.yaml
oqucat-client/pnpm-workspace.yaml
oqucat-client/public/.well-known/assetlinks.json
oqucat-client/public/app-icon.png
oqucat-client/public/apple-touch-icon-180x180.png
oqucat-client/public/favicon.ico
oqucat-client/public/firebase-messaging-sw.js
oqucat-client/public/fonts/Pangolin-Regular.ttf
oqucat-client/public/fonts/Play-Bold.ttf
oqucat-client/public/fonts/Play-Regular.ttf
oqucat-client/public/fonts/YesevaOne-Regular.ttf
oqucat-client/public/icon-splash.png
oqucat-client/public/images/flags/en.svg
oqucat-client/public/images/flags/kk.svg
oqucat-client/public/images/flags/ru.svg
oqucat-client/public/logo-small.svg
oqucat-client/public/logo.svg
oqucat-client/public/maskable-icon-512x512.png
oqucat-client/public/models/vasya.fbx
oqucat-client/public/pwa-192x192.png
oqucat-client/public/pwa-512x512.png
oqucat-client/public/pwa-64x64.png
oqucat-client/public/robots.txt
oqucat-client/public/sounds/greet_en.ogg
oqucat-client/public/sounds/greet_kk.ogg
oqucat-client/public/sounds/greet_ru.ogg
oqucat-client/public/tech/axios.svg
oqucat-client/public/tech/better-auth.svg
oqucat-client/public/tech/express.svg
oqucat-client/public/tech/firebase.svg
oqucat-client/public/tech/matplotlib.svg
oqucat-client/public/tech/mui.svg
oqucat-client/public/tech/nestjs.svg
oqucat-client/public/tech/nextjs.svg
oqucat-client/public/tech/nodejs.svg
oqucat-client/public/tech/numpy.svg
oqucat-client/public/tech/openai.svg
oqucat-client/public/tech/oxc.svg
oqucat-client/public/tech/pandas.svg
oqucat-client/public/tech/postgresql.svg
oqucat-client/public/tech/python.svg
oqucat-client/public/tech/pytorch.svg
oqucat-client/public/tech/react-bits.svg
oqucat-client/public/tech/react.svg
oqucat-client/public/tech/scikit-learn.svg
oqucat-client/public/tech/scipy.svg
oqucat-client/public/tech/seaborn.svg
oqucat-client/public/tech/tensorflow.svg
oqucat-client/public/tech/threejs.svg
oqucat-client/public/tech/typescript.svg
oqucat-client/public/tech/vite.svg
oqucat-client/public/user-icon.png
oqucat-client/pwa-assets.config.ts
oqucat-client/scripts/dev.mjs
oqucat-client/scripts/generate-envs.js
oqucat-client/scripts/tauri-env.mjs
oqucat-client/skills-lock.json
oqucat-client/src-tauri/.gitignore
oqucat-client/src-tauri/Cargo.lock
oqucat-client/src-tauri/Cargo.toml
oqucat-client/src-tauri/build.rs
oqucat-client/src-tauri/capabilities/default.json
oqucat-client/src-tauri/gen/android/.editorconfig
oqucat-client/src-tauri/gen/android/.gitignore
oqucat-client/src-tauri/gen/android/app/.gitignore
oqucat-client/src-tauri/gen/android/app/build.gradle.kts
oqucat-client/src-tauri/gen/android/app/proguard-rules.pro
oqucat-client/src-tauri/gen/android/app/src/main/AndroidManifest.xml
oqucat-client/src-tauri/gen/android/app/src/main/java/kz/davdev/oqucat/FcmEventStore.kt
oqucat-client/src-tauri/gen/android/app/src/main/java/kz/davdev/oqucat/FcmMessagingService.kt
oqucat-client/src-tauri/gen/android/app/src/main/java/kz/davdev/oqucat/MainActivity.kt
oqucat-client/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
oqucat-client/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml
oqucat-client/src-tauri/gen/android/app/src/main/res/drawable/icon_badge.png
oqucat-client/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
oqucat-client/src-tauri/gen/android/app/src/main/res/values-night/themes.xml
oqucat-client/src-tauri/gen/android/app/src/main/res/values/colors.xml
oqucat-client/src-tauri/gen/android/app/src/main/res/values/ic_launcher_background.xml
oqucat-client/src-tauri/gen/android/app/src/main/res/values/strings.xml
oqucat-client/src-tauri/gen/android/app/src/main/res/values/themes.xml
oqucat-client/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml
oqucat-client/src-tauri/gen/android/build.gradle.kts
oqucat-client/src-tauri/gen/android/buildSrc/build.gradle.kts
oqucat-client/src-tauri/gen/android/buildSrc/src/main/java/kz/davdev/davdev/kotlin/BuildTask.kt
oqucat-client/src-tauri/gen/android/buildSrc/src/main/java/kz/davdev/davdev/kotlin/RustPlugin.kt
oqucat-client/src-tauri/gen/android/gradle.properties
oqucat-client/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar
oqucat-client/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties
oqucat-client/src-tauri/gen/android/gradlew
oqucat-client/src-tauri/gen/android/gradlew.bat
oqucat-client/src-tauri/gen/android/settings.gradle
oqucat-client/src-tauri/icons/128x128.png
oqucat-client/src-tauri/icons/[email protected]
oqucat-client/src-tauri/icons/32x32.png
oqucat-client/src-tauri/icons/64x64.png
oqucat-client/src-tauri/icons/Square107x107Logo.png
oqucat-client/src-tauri/icons/Square142x142Logo.png
oqucat-client/src-tauri/icons/Square150x150Logo.png
oqucat-client/src-tauri/icons/Square284x284Logo.png
oqucat-client/src-tauri/icons/Square30x30Logo.png
oqucat-client/src-tauri/icons/Square310x310Logo.png
oqucat-client/src-tauri/icons/Square44x44Logo.png
oqucat-client/src-tauri/icons/Square71x71Logo.png
oqucat-client/src-tauri/icons/Square89x89Logo.png
oqucat-client/src-tauri/icons/StoreLogo.png
oqucat-client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml
oqucat-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png
oqucat-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png
oqucat-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png
oqucat-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png
oqucat-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png
oqucat-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png
oqucat-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png
oqucat-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png
oqucat-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png
oqucat-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png
oqucat-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png
oqucat-client/src-tauri/icons/android/values/ic_launcher_background.xml
oqucat-client/src-tauri/icons/icon.icns
oqucat-client/src-tauri/icons/icon.ico
oqucat-client/src-tauri/icons/icon.png
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/icons/ios/[email protected]
oqucat-client/src-tauri/src/lib.rs
oqucat-client/src-tauri/src/main.rs
oqucat-client/src-tauri/tauri.conf.json
oqucat-client/src/api/http/QueryKeys.ts
oqucat-client/src/api/http/applications.ts
oqucat-client/src/api/http/assistant.ts
oqucat-client/src/api/http/auth.ts
oqucat-client/src/api/http/cards.ts
oqucat-client/src/api/http/chat.ts
oqucat-client/src/api/http/index.ts
oqucat-client/src/api/http/leaderboards.ts
oqucat-client/src/api/http/marketplace.ts
oqucat-client/src/api/http/notification.ts
oqucat-client/src/api/http/onboarding.ts
oqucat-client/src/api/http/students.ts
oqucat-client/src/api/http/teams.ts
oqucat-client/src/api/http/user.ts
oqucat-client/src/api/sio/ws.ts
oqucat-client/src/auth/authError.ts
oqucat-client/src/auth/betterAuth.ts
oqucat-client/src/components/AppInstallPrompt.tsx
oqucat-client/src/components/AppSuspense.tsx
oqucat-client/src/components/NotificationsPrompt.tsx
oqucat-client/src/components/PlatformBrand.tsx
oqucat-client/src/components/PlatformControls.tsx
oqucat-client/src/components/RootLayout.tsx
oqucat-client/src/components/ThemeSwitcher.tsx
oqucat-client/src/components/UserAvatarFallback.tsx
oqucat-client/src/components/WithAuth.tsx
oqucat-client/src/components/WorkspaceLayout.tsx
oqucat-client/src/components/custom-cursor/CustomCursor.css
oqucat-client/src/components/custom-cursor/CustomCursor.tsx
oqucat-client/src/components/i18n/LandingLangChip.tsx
oqucat-client/src/components/i18n/LangChip.tsx
oqucat-client/src/components/i18n/changeLanguage.ts
oqucat-client/src/components/i18n/getLangName.ts
oqucat-client/src/components/react-bits/ASCIIText.tsx
oqucat-client/src/components/react-bits/Aurora.tsx
oqucat-client/src/components/react-bits/BorderGlow.css
oqucat-client/src/components/react-bits/BorderGlow.tsx
oqucat-client/src/components/react-bits/ClickSpark.tsx
oqucat-client/src/components/react-bits/CodeSlots.tsx
oqucat-client/src/components/react-bits/CometDial.tsx
oqucat-client/src/components/react-bits/Counter.css
oqucat-client/src/components/react-bits/Counter.tsx
oqucat-client/src/components/react-bits/CurvedLoop.tsx
oqucat-client/src/components/react-bits/DecryptedText.tsx
oqucat-client/src/components/react-bits/ElectricBorder.tsx
oqucat-client/src/components/react-bits/FuzzyText.tsx
oqucat-client/src/components/react-bits/GlowCursor.tsx
oqucat-client/src/components/react-bits/HyperSpeedPresets.ts
oqucat-client/src/components/react-bits/Hyperspeed.tsx
oqucat-client/src/components/react-bits/Iridescence.tsx
oqucat-client/src/components/react-bits/Lanyard.css
oqucat-client/src/components/react-bits/Lanyard.tsx
oqucat-client/src/components/react-bits/LaserFlow.tsx
oqucat-client/src/components/react-bits/Lightfall.css
oqucat-client/src/components/react-bits/Lightfall.tsx
oqucat-client/src/components/react-bits/Magnet.tsx
oqucat-client/src/components/react-bits/Plasma.tsx
oqucat-client/src/components/react-bits/PulseHeart.tsx
oqucat-client/src/components/react-bits/Ribbons.css
oqucat-client/src/components/react-bits/Ribbons.tsx
oqucat-client/src/components/react-bits/RubberSegment.tsx
oqucat-client/src/components/react-bits/SpecularButton.tsx
oqucat-client/src/components/react-bits/SplitFlapText.tsx
oqucat-client/src/components/react-bits/StickerPeel.css
oqucat-client/src/components/react-bits/StickerPeel.tsx
oqucat-client/src/components/react-bits/StrokeText.tsx
oqucat-client/src/components/react-bits/SwipeToast.tsx
oqucat-client/src/components/react-bits/TearTicket.css
oqucat-client/src/components/react-bits/TearTicket.tsx
oqucat-client/src/components/react-bits/TextLoop.tsx
oqucat-client/src/components/react-bits/TextType.tsx
oqucat-client/src/components/react-bits/WarmTooltip.css
oqucat-client/src/components/react-bits/WarmTooltip.tsx
oqucat-client/src/components/react-bits/WebThreads.tsx
oqucat-client/src/components/vasya/Vasya.tsx
oqucat-client/src/components/vasya/VasyaControls.ts
oqucat-client/src/components/vasya/VasyaDisplay.tsx
oqucat-client/src/components/vasya/VasyaExpressions.ts
oqucat-client/src/components/vasya/VasyaRig.ts
oqucat-client/src/components/vasya/useVasyaVoiceAssistant.ts
oqucat-client/src/config.ts
oqucat-client/src/context/notification/NotificationProvider.tsx
oqucat-client/src/context/notification/ToastContent.tsx
oqucat-client/src/context/notification/notificationStore.ts
oqucat-client/src/context/notification/notify.tsx
oqucat-client/src/context/theme/AppThemeProvider.tsx
oqucat-client/src/context/user/UserContext.tsx
oqucat-client/src/context/user/UserProvider.tsx
oqucat-client/src/context/user/useUser.ts
oqucat-client/src/firebase.ts
oqucat-client/src/i18n.ts
oqucat-client/src/index.css
oqucat-client/src/locales/en/business.json
oqucat-client/src/locales/en/common.json
oqucat-client/src/locales/en/superadmin.json
oqucat-client/src/locales/en/user.json
oqucat-client/src/locales/kk/business.json
oqucat-client/src/locales/kk/common.json
oqucat-client/src/locales/kk/superadmin.json
oqucat-client/src/locales/kk/user.json
oqucat-client/src/locales/ru/business.json
oqucat-client/src/locales/ru/common.json
oqucat-client/src/locales/ru/superadmin.json
oqucat-client/src/locales/ru/user.json
oqucat-client/src/main.tsx
oqucat-client/src/notifications/index.ts
oqucat-client/src/notifications/tauri.ts
oqucat-client/src/notifications/web.ts
oqucat-client/src/pages/business/AllTabsBusiness.tsx
oqucat-client/src/pages/business/cards/BusinessCards.tsx
oqucat-client/src/pages/business/cards/CardAssistant.tsx
oqucat-client/src/pages/business/cards/CardClarifications.tsx
oqucat-client/src/pages/business/cards/CardEditor.tsx
oqucat-client/src/pages/business/cards/CardEditorForm.tsx
oqucat-client/src/pages/business/cards/CardList.tsx
oqucat-client/src/pages/business/cards/CardRating.tsx
oqucat-client/src/pages/business/cards/CardVasyaAvatar.tsx
oqucat-client/src/pages/business/cards/CompanySetup.tsx
oqucat-client/src/pages/business/cards/CreateCardIntro.tsx
oqucat-client/src/pages/business/cards/DynamicFields.tsx
oqucat-client/src/pages/business/cards/PublicationDialog.tsx
oqucat-client/src/pages/business/cards/VoiceInput.tsx
oqucat-client/src/pages/business/cards/cardError.ts
oqucat-client/src/pages/business/cards/cardForm.ts
oqucat-client/src/pages/business/cards/dynamicFieldValues.ts
oqucat-client/src/pages/business/cards/useCardClarifications.ts
oqucat-client/src/pages/business/cards/useCardEditor.ts
oqucat-client/src/pages/business/cards/useCardQuestionVoice.ts
oqucat-client/src/pages/common/Dashboard.tsx
oqucat-client/src/pages/common/ErrorPage.tsx
oqucat-client/src/pages/common/auth/BackToLoginButton.tsx
oqucat-client/src/pages/common/auth/Captcha.tsx
oqucat-client/src/pages/common/auth/Login.tsx
oqucat-client/src/pages/common/auth/PasswordField.tsx
oqucat-client/src/pages/common/auth/RecentAccountsControl.tsx
oqucat-client/src/pages/common/auth/TwoFactorVerification.tsx
oqucat-client/src/pages/common/auth/dialogs/ConfirmEmail.tsx
oqucat-client/src/pages/common/auth/dialogs/ResetPassword.tsx
oqucat-client/src/pages/common/auth/emailConfirmationState.ts
oqucat-client/src/pages/common/auth/steps/LoginEmailStep.tsx
oqucat-client/src/pages/common/auth/steps/LoginSignInStep.tsx
oqucat-client/src/pages/common/auth/steps/LoginSignUpStep.tsx
oqucat-client/src/pages/common/auth/widgets/FacebookButton.tsx
oqucat-client/src/pages/common/auth/widgets/ForgotPassword.tsx
oqucat-client/src/pages/common/auth/widgets/GithubButton.tsx
oqucat-client/src/pages/common/auth/widgets/GoogleButton.tsx
oqucat-client/src/pages/common/auth/widgets/MicrosoftButton.tsx
oqucat-client/src/pages/common/auth/widgets/OAuthButton.tsx
oqucat-client/src/pages/common/auth/widgets/OAuthButtonBase.tsx
oqucat-client/src/pages/common/auth/widgets/PasskeyButton.tsx
oqucat-client/src/pages/common/auth/widgets/SocialIconButton.tsx
oqucat-client/src/pages/common/auth/widgets/TelegramLoginButton.tsx
oqucat-client/src/pages/common/auth/widgets/telegram.ts
oqucat-client/src/pages/common/chat/Chat.tsx
oqucat-client/src/pages/common/chat/ChatBadge.tsx
oqucat-client/src/pages/common/chat/ChatContent.tsx
oqucat-client/src/pages/common/chat/ChatStatus.tsx
oqucat-client/src/pages/common/chat/chatAdapter.ts
oqucat-client/src/pages/common/chat/chatConversation.ts
oqucat-client/src/pages/common/chat/conversationSound.ts
oqucat-client/src/pages/common/landing/Landing.tsx
oqucat-client/src/pages/common/landing/LandingAudience.tsx
oqucat-client/src/pages/common/landing/LandingHeader.tsx
oqucat-client/src/pages/common/landing/LandingHero.tsx
oqucat-client/src/pages/common/landing/LandingPreview.tsx
oqucat-client/src/pages/common/landing/LandingReveal.tsx
oqucat-client/src/pages/common/landing/LandingScrollProgress.tsx
oqucat-client/src/pages/common/landing/LandingSmoothScroll.tsx
oqucat-client/src/pages/common/profile/BackupCodes.tsx
oqucat-client/src/pages/common/profile/ConnectedAccountsSection.tsx
oqucat-client/src/pages/common/profile/PasskeySection.tsx
oqucat-client/src/pages/common/profile/Profile.tsx
oqucat-client/src/pages/common/profile/ProfileCard.tsx
oqucat-client/src/pages/common/profile/SessionsSection.tsx
oqucat-client/src/pages/common/profile/TwoFactorSection.tsx
oqucat-client/src/pages/onboarding/AllTabsOnboarding.tsx
oqucat-client/src/pages/onboarding/RoleSelection.tsx
oqucat-client/src/pages/superadmin/AllTabsSuperAdmin.tsx
oqucat-client/src/pages/superadmin/notifications/NotificationsSuperadmin.tsx
oqucat-client/src/pages/user/AllTabsUser.tsx
oqucat-client/src/pages/user/rankings/Rankings.tsx
oqucat-client/src/pages/user/responses/ApplicationForm.tsx
oqucat-client/src/pages/user/responses/Responses.tsx
oqucat-client/src/pages/user/tasks/TaskDetails.tsx
oqucat-client/src/pages/user/tasks/Tasks.tsx
oqucat-client/src/pages/user/team/Team.tsx
oqucat-client/src/pages/user/team/TeamContent.tsx
oqucat-client/src/pages/user/team/TeamForm.tsx
oqucat-client/src/pages/user/team/TeamInvitations.tsx
oqucat-client/src/pages/user/team/TeamMembers.tsx
oqucat-client/src/pages/user/team/TeamOverview.tsx
oqucat-client/src/types/Chat.ts
oqucat-client/src/types/EmailCheckResult.ts
oqucat-client/src/types/Languages.ts
oqucat-client/src/types/Leaderboard.ts
oqucat-client/src/types/Marketplace.ts
oqucat-client/src/types/NotifySeverity.ts
oqucat-client/src/types/ProjectApplication.ts
oqucat-client/src/types/ProjectCard.ts
oqucat-client/src/types/PushInstallationInput.ts
oqucat-client/src/types/RecentAccounts.ts
oqucat-client/src/types/ResMessage.ts
oqucat-client/src/types/StudentProfile.ts
oqucat-client/src/types/Team.ts
oqucat-client/src/types/User.ts
oqucat-client/src/types/UserForNotif.ts
oqucat-client/src/types/UserId.ts
oqucat-client/src/types/UserRole.ts
oqucat-client/src/types/WorkspaceItem.ts
oqucat-client/src/utils/convertDate.ts
oqucat-client/src/utils/copyQrImage.ts
oqucat-client/src/utils/copyToClipboard.ts
oqucat-client/src/utils/getAvatar.ts
oqucat-client/src/utils/getLocale.ts
oqucat-client/src/utils/getMarketplaceError.ts
oqucat-client/src/utils/getState.ts
oqucat-client/src/utils/getTz.ts
oqucat-client/src/utils/isTauri.ts
oqucat-client/src/utils/logger.ts
oqucat-client/src/utils/notifications.ts
oqucat-client/src/utils/recentAccounts/addRecentAccount.ts
oqucat-client/src/utils/recentAccounts/getRecentAccounts.ts
oqucat-client/src/utils/recentAccounts/isRecentAccount.ts
oqucat-client/src/utils/recentAccounts/isRecentAccountStore.ts
oqucat-client/src/utils/recentAccounts/isRecord.ts
oqucat-client/src/utils/useThemeColors.ts
oqucat-client/src/vite-env.d.ts
oqucat-client/sync.js
oqucat-client/tsconfig.app.json
oqucat-client/tsconfig.json
oqucat-client/tsconfig.node.json
oqucat-client/vite.config.ts
oqucat-server/.agents/skills/better-auth-best-practices/SKILL.md
oqucat-server/.agents/skills/better-auth-security-best-practices/SKILL.md
oqucat-server/.agents/skills/create-auth/SKILL.md
oqucat-server/.agents/skills/email-and-password-best-practices/SKILL.md
oqucat-server/.agents/skills/find-skills/SKILL.md
oqucat-server/.agents/skills/llms.txt
oqucat-server/.agents/skills/organization-best-practices/SKILL.md
oqucat-server/.agents/skills/two-factor-authentication-best-practices/SKILL.md
oqucat-server/.codex/config.toml
oqucat-server/.env.example
oqucat-server/.gitattributes
oqucat-server/.gitignore
oqucat-server/README.md
oqucat-server/build.js
oqucat-server/ecosystem.config.cjs
oqucat-server/oxfmt.config.ts
oqucat-server/oxlint.config.ts
oqucat-server/package.json
oqucat-server/pnpm-lock.yaml
oqucat-server/pnpm-workspace.yaml
oqucat-server/scripts/generate-envs.js
oqucat-server/skills/better-auth-best-practices/SKILL.md
oqucat-server/skills/better-auth-security-best-practices/SKILL.md
oqucat-server/skills/create-auth/SKILL.md
oqucat-server/skills/email-and-password-best-practices/SKILL.md
oqucat-server/skills/find-skills/SKILL.md
oqucat-server/skills/llms.txt
oqucat-server/skills/organization-best-practices/SKILL.md
oqucat-server/skills/two-factor-authentication-best-practices/SKILL.md
oqucat-server/src/config.ts
oqucat-server/src/db.ts
oqucat-server/src/i18n.ts
oqucat-server/src/index.ts
oqucat-server/src/locales/en/common.json
oqucat-server/src/locales/kk/common.json
oqucat-server/src/locales/ru/common.json
oqucat-server/src/logger.ts
oqucat-server/src/middleware/accessLevel.ts
oqucat-server/src/middleware/error.ts
oqucat-server/src/middleware/requireRole.ts
oqucat-server/src/middleware/validateRequest.ts
oqucat-server/src/modules/ai/ai.routes.ts
oqucat-server/src/modules/application/ApplicationDecision.model.ts
oqucat-server/src/modules/application/ProjectApplication.model.ts
oqucat-server/src/modules/application/application.routes.ts
oqucat-server/src/modules/application/application.schemas.ts
oqucat-server/src/modules/auth/Account.model.ts
oqucat-server/src/modules/auth/Passkey.model.ts
oqucat-server/src/modules/auth/Session.model.ts
oqucat-server/src/modules/auth/TwoFactor.model.ts
oqucat-server/src/modules/auth/Verification.model.ts
oqucat-server/src/modules/auth/altauth.routes.ts
oqucat-server/src/modules/auth/auth.schemas.ts
oqucat-server/src/modules/auth/betterAuth.ts
oqucat-server/src/modules/auth/emailVerificationSession.ts
oqucat-server/src/modules/card/ProjectCard.model.ts
oqucat-server/src/modules/card/ProjectCardField.model.ts
oqucat-server/src/modules/card/ProjectCardReview.model.ts
oqucat-server/src/modules/card/ProjectCardTag.model.ts
oqucat-server/src/modules/card/ProjectClarification.model.ts
oqucat-server/src/modules/card/card.routes.ts
oqucat-server/src/modules/card/card.schemas.ts
oqucat-server/src/modules/card/card.utils.ts
oqucat-server/src/modules/card/cardAi.routes.ts
oqucat-server/src/modules/card/cardContent.ts
oqucat-server/src/modules/card/cardReview.schema.ts
oqucat-server/src/modules/card/projectCardClarification.service.ts
oqucat-server/src/modules/card/projectCardDraft.service.ts
oqucat-server/src/modules/card/projectCardReview.service.ts
oqucat-server/src/modules/chat/Message.model.ts
oqucat-server/src/modules/chat/chat.routes.ts
oqucat-server/src/modules/chat/chat.schemas.ts
oqucat-server/src/modules/company/Company.model.ts
oqucat-server/src/modules/company/company.routes.ts
oqucat-server/src/modules/company/company.schemas.ts
oqucat-server/src/modules/email/confEmail.ts
oqucat-server/src/modules/email/index.ts
oqucat-server/src/modules/email/templates/adminRegEmail.ts
oqucat-server/src/modules/email/templates/confirmEmail.ts
oqucat-server/src/modules/email/templates/doctorRegEmail.ts
oqucat-server/src/modules/email/templates/passResetEmail.ts
oqucat-server/src/modules/llm/generateVoice.ts
oqucat-server/src/modules/llm/getOpenaiResponse.ts
oqucat-server/src/modules/llm/openai.ts
oqucat-server/src/modules/llm/realtime.ts
oqucat-server/src/modules/llm/safetyIdentifier.ts
oqucat-server/src/modules/llm/systemMessage.ts
oqucat-server/src/modules/notification/cron.ts
oqucat-server/src/modules/notification/firebase/app.ts
oqucat-server/src/modules/notification/firebase/messaging.ts
oqucat-server/src/modules/notification/firebase/sendWebPush.ts
oqucat-server/src/modules/notification/notification.routes.ts
oqucat-server/src/modules/notification/notification.schemas.ts
oqucat-server/src/modules/onboarding/onboarding.routes.ts
oqucat-server/src/modules/onboarding/onboarding.schemas.ts
oqucat-server/src/modules/points/StudentPointHistory.model.ts
oqucat-server/src/modules/points/TeamPointHistory.model.ts
oqucat-server/src/modules/points/leaderboard.routes.ts
oqucat-server/src/modules/points/points.routes.ts
oqucat-server/src/modules/points/points.schemas.ts
oqucat-server/src/modules/review/Review.model.ts
oqucat-server/src/modules/review/review.routes.ts
oqucat-server/src/modules/review/review.schemas.ts
oqucat-server/src/modules/sio/socket.ts
oqucat-server/src/modules/student/StudentProfile.model.ts
oqucat-server/src/modules/student/StudentTag.model.ts
oqucat-server/src/modules/student/student.routes.ts
oqucat-server/src/modules/student/student.schemas.ts
oqucat-server/src/modules/tag/Tag.model.ts
oqucat-server/src/modules/tag/tag.routes.ts
oqucat-server/src/modules/tag/tag.schemas.ts
oqucat-server/src/modules/team/Team.model.ts
oqucat-server/src/modules/team/TeamMember.model.ts
oqucat-server/src/modules/team/team.routes.ts
oqucat-server/src/modules/team/team.schemas.ts
oqucat-server/src/modules/telegram/bot.ts
oqucat-server/src/modules/user/PushInstallation.model.ts
oqucat-server/src/modules/user/User.model.ts
oqucat-server/src/modules/user/user.routes.ts
oqucat-server/src/modules/user/user.schemas.ts
oqucat-server/src/router.ts
oqucat-server/src/seeding/index.ts
oqucat-server/src/seeding/seedRootAdmin.ts
oqucat-server/src/sio.ts
oqucat-server/src/staticDirs.ts
oqucat-server/src/types/ApplicationDecisionStatus.ts
oqucat-server/src/types/ApplicationStatus.ts
oqucat-server/src/types/Auth.ts
oqucat-server/src/types/CardCreationMethod.ts
oqucat-server/src/types/CardStatus.ts
oqucat-server/src/types/DynamicFieldType.ts
oqucat-server/src/types/IdentifierType.ts
oqucat-server/src/types/JsonValue.ts
oqucat-server/src/types/Languages.ts
oqucat-server/src/types/Platform.ts
oqucat-server/src/types/PointTransactionReason.ts
oqucat-server/src/types/ProjectApplicationMaterials.ts
oqucat-server/src/types/TeamMemberStatus.ts
oqucat-server/src/types/UserId.ts
oqucat-server/src/types/UserRole.ts
oqucat-server/src/types/express.d.ts
oqucat-server/src/utils/escapeHtml.ts
oqucat-server/src/utils/generatePassword.ts
oqucat-server/src/utils/getT.ts
oqucat-server/src/utils/getUserHour.ts
oqucat-server/src/utils/isLanguage.ts
oqucat-server/src/utils/isPasswordPwned.ts
oqucat-server/src/utils/isRecord.ts
oqucat-server/src/utils/parseFirebase.ts
oqucat-server/src/utils/replaceExternalAvatar.ts
oqucat-server/src/utils/saveAvatar.ts
oqucat-server/src/utils/updateUserLocaleTz.ts
oqucat-server/static/vasya.png
oqucat-server/sync.js
oqucat-server/tests/README.md
oqucat-server/tests/cardCreation.test.ts
oqucat-server/tests/tsconfig.json
oqucat-server/tsconfig.json
scripts/pre-commit.mjs
scripts/prepare-commit-msg.mjs

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

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

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