Trust ME (EventMatch)
Мобильное приложение на React Native/Expo с Node.js API, которое подбирает до трёх подрядчиков мероприятия по городу, дате, категории, бюджету…
О проекте
Команда: 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.mdTrust ME (EventMatch) — подбор подрядчиков для мероприятий
Краткое описание
Trust ME помогает организаторам мероприятий в Казахстане быстро найти подрядчика под конкретную дату и бюджет. Вместо просмотра всего каталога пользователь задаёт условия события и получает до трёх подходящих вариантов с объяснением выбора. Это прототип для задачи HackAlem «Умный подбор подрядчиков (#79-lite)».
Что реализовано
- Мобильный интерфейс с тремя шагами: событие и дата → категория подрядчика и бюджет → дополнительные пожелания (язык и длительность).
- Подбор по городу, категории, свободной дате, стартовой цене, формату мероприятия, языку и длительности.
- Детерминированная выдача до трёх карточек: повторный запрос с теми же данными сохраняет порядок.
- В каждой карточке: анонимизированное имя, категория, город, цена «от», объяснение и отметки о синтетических или дополненных данных.
- Отдельные состояния для отсутствующей категории в городе, отсутствия совпадений и ошибки сети; можно изменить условия или повторить запрос.
- HTTP API и интеграционный тест для проверки подбора без мобильного приложения.
Как работает решение
- Пользователь выбирает формат, город, дату, категорию и бюджет; при необходимости добавляет язык и длительность.
- Приложение отправляет JSON-запрос в
POST /recommendations. - Сервер читает каталог из
backend/src/data/contractors.json, исключает неподходящие профили и ранжирует оставшиеся по фиксированным правилам. При равенстве баллов учитываются цена и ID. - Приложение показывает до трёх карточек с объяснением на основе данных профиля либо сообщает, почему результатов нет. Бронирование и связь с подрядчиком в этом сценарии не выполняются.
Технологии
| Компонент | Используется |
|---|---|
| Интерфейс | 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.js | HTTP-маршруты /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/ и открывать установленное приложение.
Как проверить решение
- Проверьте API по адресу
/health: ожидаетсяcontractor_count: 66(при локальном запуске используйтеhttp://localhost:3000/health). - В интерфейсе выберите Алматы, корпоратив, Ведущий, бюджет 800 000 ₸, дату 17.10.2026; язык и длительность оставьте пустыми. Нажмите «Найти моих людей». Ожидается сообщение об отсутствии совпадений (
no_matchesв API). - Измените только дату на 19.10.2026 и повторите поиск. Ожидается одна карточка: Аня Форджер, цена от 700 000 ₸, с объяснением (
matchedв API). - Повторите запрос с теми же условиями: результат и порядок должны совпасть. Для автоматической проверки сервера выполните
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). - Публичной ссылки на готовое мобильное приложение в репозитории нет; интерфейс запускается по инструкции выше.
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.