Oqucat
Полнофункциональный full-stack шаблон (авторизация, чаты, push, PWA/Tauri) с добавленным кабинетом бизнеса, где создаются карточки задач с…
О проекте
Команда: 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. Команды выполняются из соответствующего каталога приложения.
-
Установить зависимости клиента и сервера:
cd oqucat-client pnpm install cd ../oqucat-server pnpm install -
Создать файлы окружения в каждом приложении на основе
.env.example:pnpm generate-envsЗаполнить
.envи.env.localнеобходимыми значениями: параметры PostgreSQL, адреса клиента и сервера, ключи Better Auth, OAuth, Firebase, Telegram, Cloudflare и LLM. Файл.envпредназначен для разработки через прокси-туннель,.env.local— для полностью локального запуска. -
Для разработки через
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. -
-
Для полностью локальной разработки на
localhostзапустить оба приложения с профилемlocal:В одном терминале:
cd oqucat-server pnpm dev:localВ другом терминале:
cd oqucat-client pnpm dev:localСкрипт
dev:localиспользует.env.local; прокси-туннель и доменdev.oqucat.dav-dev.kzне требуются. -
Для проверки production-сборки выполнить в каждом приложении:
cd oqucat-server pnpm build cd ../oqucat-client pnpm buildКлиент после сборки можно предварительно просмотреть командой
pnpm preview. Для публикации предусмотрены командыpnpm sync: клиент передаёт сборку на сервер, а сервер загружает собранный файл и перезапускает приложение через PM2. -
Установка и запуск 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.
- Подготовить пользовательскую и техническую документацию.
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.