AAYMA
RU
Войти

Trust ME (EventMatch)

Мобильное приложение на React Native/Expo с Node.js API, которое подбирает до трёх подрядчиков мероприятия по городу, дате, категории, бюджету…

Рабочий MVP
Команда «Fact check» 7💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Fact check
Кейс HackAlem.ai: Креативные индустрии — Firebird
Стадия: Рабочий MVP

Задача кейса: «#79-lite»: подобрать до 3 подрядчиков для мероприятия и объяснить выбор

Суть

Мобильное приложение на React Native/Expo с Node.js API, которое подбирает до трёх подрядчиков мероприятия по городу, дате, категории, бюджету, формату, языку и длительности и объясняет выбор.

Как устроено

Трёхшаговая форма отправляет запрос на POST /recommendations. Сервер загружает contractors.json (66 анонимизированных профилей, часть синтетических), отсекает неподходящих по городу, категории, свободной дате и цене и ранжирует остальных по фиксированным правилам. При равенстве баллов учитываются цена и ID. В ответе до 3 карточек с объяснением из данных профиля и флагами synthetic/city_imputed/price_imputed, отдельно обрабатываются no_matches и date_out_of_range. LLM не используется, совпадение с описанием проверяется лексически.

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

  • rule-based filtering
  • deterministic scoring with tie-break
  • lexical matching
  • template explanations

Особенности

В карточках видно происхождение данных (флаги synthetic, city_imputed, price_imputed). Есть воспроизводимый сценарий проверки: смена только даты переводит результат из no_matches в matched. API развёрнут на Railway, бэкенд без внешних npm-зависимостей.

Стек

React Native · Expo SDK 57 · Expo Router · NativeWind · Tailwind CSS · Zustand · Axios · Node.js · Railway


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

README

README.md

Trust ME (EventMatch) — подбор подрядчиков для мероприятий

Краткое описание

Trust ME помогает организаторам мероприятий в Казахстане быстро найти подрядчика под конкретную дату и бюджет. Вместо просмотра всего каталога пользователь задаёт условия события и получает до трёх подходящих вариантов с объяснением выбора. Это прототип для задачи HackAlem «Умный подбор подрядчиков (#79-lite)».

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

  • Мобильный интерфейс с тремя шагами: событие и дата → категория подрядчика и бюджет → дополнительные пожелания (язык и длительность).
  • Подбор по городу, категории, свободной дате, стартовой цене, формату мероприятия, языку и длительности.
  • Детерминированная выдача до трёх карточек: повторный запрос с теми же данными сохраняет порядок.
  • В каждой карточке: анонимизированное имя, категория, город, цена «от», объяснение и отметки о синтетических или дополненных данных.
  • Отдельные состояния для отсутствующей категории в городе, отсутствия совпадений и ошибки сети; можно изменить условия или повторить запрос.
  • HTTP API и интеграционный тест для проверки подбора без мобильного приложения.

Как работает решение

  1. Пользователь выбирает формат, город, дату, категорию и бюджет; при необходимости добавляет язык и длительность.
  2. Приложение отправляет JSON-запрос в POST /recommendations.
  3. Сервер читает каталог из backend/src/data/contractors.json, исключает неподходящие профили и ранжирует оставшиеся по фиксированным правилам. При равенстве баллов учитываются цена и ID.
  4. Приложение показывает до трёх карточек с объяснением на основе данных профиля либо сообщает, почему результатов нет. Бронирование и связь с подрядчиком в этом сценарии не выполняются.

Технологии

КомпонентИспользуется
ИнтерфейсJavaScript/JSX, React Native, Expo SDK 57, Expo Router, NativeWind 4 / Tailwind CSS 3, Lucide
Состояние и запросыZustand, Axios, HTTP/JSON
СерверNode.js 22+, JavaScript, встроенный модуль node:http (без сторонних npm-зависимостей)
ПроверкиВстроенный node:test для интеграционного теста сервера
AI-моделиВ текущей версии не подключены: фильтры, оценка и объяснения реализованы программно; совпадение с описанием проверяется лексически

Архитектура проекта

ПутьРоль
frontend/src/app/, frontend/src/components/Форма из трёх шагов и экран результатов
frontend/src/store/useOrderStore.js, frontend/src/services/api.jsСостояние запроса, вызов API и обработка ответа
backend/server.jsHTTP-маршруты /health, /catalog, /recommendations и валидация HTTP-запросов
backend/recommendations.jsЗагрузка и нормализация каталога, проверка условий, ранжирование и объяснения
backend/src/data/contractors.jsonКаталог подрядчиков, загружаемый сервером при старте

Цепочка данных: форма → Axios → HTTP API → каталог и алгоритм подбора → JSON-ответ → карточки или причина отсутствия результатов. В backend/src/services/ есть сохранённые модули, но запущенный HTTP API использует backend/recommendations.js.

Установка и запуск

Нужны Git, npm и Node.js 22.13 или новее. Из терминала:

git clone https://github.com/BAITC-Hacks/hack-3fa15a7b-fact-check.git
cd hack-3fa15a7b-fact-check

1. Выберите API. Для быстрого демо можно использовать развёрнутый сервер. Для локального запуска в первом терминале из корня репозитория:

cd backend
npm start

Проверка локального сервера: откройте http://localhost:3000/health. Ожидается {"status":"ok","contractor_count":66}. В backend/ нет внешних npm-зависимостей, установка пакетов там не требуется. По умолчанию сервер слушает порт 3000; его можно изменить переменной PORT.

2. Настройте адрес сервера. Откройте frontend/.env (или создайте файл, если его нет) и задайте публичный адрес для демо:

EXPO_PUBLIC_API_URL=https://trustme-production.up.railway.app
EXPO_PUBLIC_RECOMMENDATIONS_PATH=/recommendations

Для локального API вместо публичного адреса используйте http://localhost:3000 в браузере или iOS Simulator, http://10.0.2.2:3000 в Android Emulator, либо http://IP_КОМПЬЮТЕРА:3000 на физическом телефоне в той же сети. localhost на телефоне указывает на сам телефон. После изменения .env перезапустите Expo.

3. Запустите интерфейс. Во втором терминале из корня репозитория:

cd frontend
npm i
npm run web

Для приложения на устройстве или эмуляторе вместо npm run web выполните одну из команд:

npm run android
npx expo run:android --device
# или на macOS с Xcode:
npm run ios
npx expo run:ios --device

Эти команды собирают и устанавливают Expo development build; для Android нужны Android SDK/эмулятор или подключённый телефон, для iOS — macOS и Xcode. После первой установки можно запускать Metro командой npm start из frontend/ и открывать установленное приложение.

Как проверить решение

  1. Проверьте API по адресу /health: ожидается contractor_count: 66 (при локальном запуске используйте http://localhost:3000/health).
  2. В интерфейсе выберите Алматы, корпоратив, Ведущий, бюджет 800 000 ₸, дату 17.10.2026; язык и длительность оставьте пустыми. Нажмите «Найти моих людей». Ожидается сообщение об отсутствии совпадений (no_matches в API).
  3. Измените только дату на 19.10.2026 и повторите поиск. Ожидается одна карточка: Аня Форджер, цена от 700 000 ₸, с объяснением (matched в API).
  4. Повторите запрос с теми же условиями: результат и порядок должны совпасть. Для автоматической проверки сервера выполните cd backend && npm test из корня репозитория.

API можно проверить отдельно (пример для Bash, URL можно заменить на http://localhost:3000):

curl -sS -X POST https://trustme-production.up.railway.app/recommendations \
  -H 'Content-Type: application/json' \
  --data '{"city":"Алматы","date":"2026-10-19","event_type":"корпоратив","category":"Ведущий","budget":800000}'

Данные и интеграции

  • Единственный источник профилей — включённый в репозиторий backend/src/data/contractors.json: 66 анонимизированных профилей. Часть профилей синтетическая; флаги synthetic, city_imputed и price_imputed обозначают происхождение или дополнение данных.
  • Даты занятости представлены в каталоге только на период 23.09.2026–31.12.2026. Город, категории, форматы и языки можно посмотреть через GET /catalog.
  • Интерфейс обращается к собственному API через Axios. API размещён на Railway; внешние сервисы поиска подрядчиков, платёжные API и LLM для выдачи не используются.

Ограничения

  • Каталог и календарь статические: доступность и цены не синхронизируются с подрядчиками. Запросы вне указанного периода возвращают date_out_of_range (HTTP 422).
  • Цена «от» — ориентир, итоговая смета и доступность требуют подтверждения у подрядчика.
  • Интерфейс предлагает заранее заданные города, форматы и категории; API работает только с профилями из включённого каталога.
  • Нет регистрации, бронирования, оплаты, уведомлений и отправки заявок. Настоящая AI-модель и смысловой поиск по описаниям пока не реализованы.

Развёрнутая версия

  • Публичный API: trustme-production.up.railway.app (проверка: /health).
  • Публичной ссылки на готовое мобильное приложение в репозитории нет; интерфейс запускается по инструкции выше.
Звёзды
⭐ 0
Форки
0
Язык
JavaScript
Последний push
в прошлом месяце
Коммиты
26
Авторы
5
Файлы
48
Ветки
5

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

SDD3108 9AruzhM 6aru 5Sara 3Sara 3

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

  • 2026-09-23 17:23readme fixSDD3108
  • 2026-09-23 17:09docs: align README with hackathon jury criteria and current codeSara
  • 2026-09-23 16:43finalSDD3108
  • 2026-09-23 16:36Merge commit '3abefa4c05521a0f431c66934f305b2c2ea1d2e0'SDD3108
  • 2026-09-23 16:30buildSDD3108
  • 2026-09-23 16:20Revise README for EventMatch project detailsAruzhM
  • 2026-09-23 15:49Organize merged backend and align frontend API statusSDD3108
  • 2026-09-23 15:48Merge dama frontend into mainSDD3108
Все коммиты (26)
  • 2026-09-23 15:47Merge sara into main, preserving backend service relocationSDD3108
  • 2026-09-23 15:45backend folderSara
  • 2026-09-23 15:34mobile app fixSDD3108
  • 2026-09-23 15:22Merge pull request #4 from BAITC-Hacks/AruzhM-backendAruzhM
  • 2026-09-23 15:21Add files via uploadAruzhM
  • 2026-09-23 15:00Merge pull request #3 from BAITC-Hacks/saraAruzhM
  • 2026-09-23 14:55Update matching algorithmaru
  • 2026-09-23 14:48Merge pull request #2 from BAITC-Hacks/aruSara
  • 2026-09-23 14:43Document matching pipelinearu
  • 2026-09-23 14:36test3aru
  • 2026-09-23 14:34added explanation service fileSara
  • 2026-09-23 14:30test2Marat Aruzhan
  • 2026-09-23 14:28testMarat Aruzhan
  • 2026-09-23 14:26mobile appSDD3108
  • 2026-09-23 14:17Merge remote-tracking branch 'origin/sara' into aruMarat Aruzhan
  • 2026-09-23 14:13Merge pull request #1 from BAITC-Hacks/saraSara
  • 2026-09-23 14:09Add contractor matching algorithmMarat Aruzhan
  • 2026-09-23 13:57added the data folder with contractors json file and data service jsSara
Структура репозитория (48 файлов)
README.md
backend/README.md
backend/package.json
backend/recommendations.js
backend/server.js
backend/src/data/contractors.json
backend/src/services/dataService.js
backend/src/services/explanationService.js
backend/src/services/machineService.js
backend/src/services/matchingService.js
backend/test/integration.test.js
frontend/.env
frontend/.gitignore
frontend/AGENTS.md
frontend/LICENSE
frontend/README.md
frontend/app.json
frontend/assets/android-icon-background.png
frontend/assets/android-icon-foreground.png
frontend/assets/android-icon-monochrome.png
frontend/assets/favicon.png
frontend/assets/icon.png
frontend/assets/splash-icon.png
frontend/babel.config.js
frontend/docs/api-contract.md
frontend/eas.json
frontend/eslint.config.js
frontend/global.css
frontend/metro.config.js
frontend/package-lock.json
frontend/package.json
frontend/src/app/_layout.jsx
frontend/src/app/index.jsx
frontend/src/components/AboutSheet.jsx
frontend/src/components/Brief.jsx
frontend/src/components/DatePicker.jsx
frontend/src/components/EventArtwork.jsx
frontend/src/components/FormControls.jsx
frontend/src/components/Results.jsx
frontend/src/components/UI.jsx
frontend/src/constants/options.js
frontend/src/constants/theme.js
frontend/src/services/api.js
frontend/src/store/useOrderStore.js
frontend/src/utils/calendar.js
frontend/src/utils/order.js
frontend/tailwind.config.js
frontend/tests/api.test.mjs
Ветки (5)

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

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

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