AI Sana Challenge Hub (Work.ai)
Кроссплатформенное Flutter-приложение Work.ai: бизнес за 3 шага уточнений формирует редактируемое ТЗ и публикует задачу, студенты откликаются.
О проекте
Команда: IT-Forge
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Кроссплатформенное Flutter-приложение Work.ai: бизнес за 3 шага уточнений формирует редактируемое ТЗ и публикует задачу, студенты откликаются. Бизнес принимает отклик, дальше работают задачи, чат и сдача решения.
Как устроено
Экраны Flutter работают с общим ChangeNotifier-хранилищем, данные сохраняются локально в SharedPreferences. Уточняющие вопросы берутся из локальных шаблонов по теме. Опционально их генерирует локальный Node-компаньон, который вызывает OpenAI Responses API для структурированных вопросов и ТЗ. Поток: проблема, бюджет и срок → 3 шага с множественным выбором и своими требованиями → редактируемая спецификация → публикация → отклик → задача → сдача URL решения.
Ключевые решения
- OpenAI Responses API
- локальные шаблоны уточнений
- ChangeNotifier state
Особенности
Нативное мобильное приложение (Android, iOS, web) с казахским интерфейсом. Ключ OpenAI вынесен в отдельный Node-сервер и не компилируется в клиент. Авторизации и общей БД нет, всё хранится локально на устройстве.
Стек
Flutter · Dart · Node.js · SharedPreferences
Модели
OpenAI Responses API
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-3228a77c-it-forge.
README
README.mdAI Sana Challenge Hub
Business challenges. Student talent. Real project experience.
A Flutter workspace that takes a business idea from a clear brief to a student proposal and project delivery.
The experience
Work.ai connects business problems with students who can solve them. Its Kazakh-language interface follows the updated design in designappwai2: blue brand accents, light surfaces, focused project cards, student/business workspaces and a guided challenge studio.
The Flutter implementation adds bundled Manrope typography, Lucide icons, tactile buttons, staged entrances and short page transitions. It respects reduced-motion settings, keeps tab state alive and adapts to a navigation rail on wider screens.
Product flows
| Discover | Create | Collaborate |
|---|---|---|
| Search titles, companies and skills. | Set the title, problem, budget and duration. | Submit a validated proposal with contact details. |
| Filter categories, sort and save projects. | Answer three questions with multiple selections and custom requirements. | Review applications and accept, invite or decline them in business mode. |
| Open each project's own brief. | Review and edit the actual specification that will be published. | Send messages, submit a solution URL and review delivery. |
From idea to published challenge
flowchart LR
A[Business problem] --> B[Title, budget, duration]
B --> C[Three clarification steps]
C --> D[Multiple choices + custom answers]
D --> E[Editable specification]
E --> F[Confirm publication]
F --> G[Discovery + business workspace]
Drafts are saved between visits. Publishing keeps the entered budget, duration, selections and edited specification. Student applications are linked to the correct project; accepting an application creates a task, and submitting a solution changes its status.
What is local, and what connects to OpenAI?
| Capability | Current boundary |
|---|---|
| Projects, bookmarks, profiles, applications, task decisions and chat | One local workspace, saved on the device with SharedPreferences |
| Guided questions without a server | Topic-based templates; the flower project includes catalog/3D/AR, delivery and AI choices from the reference |
| Optional OpenAI assistance | A companion Node server calls the Responses API for structured questions and editable specifications |
| Authentication and company delivery | Not connected; local role switching is not server authentication |
| Payments and escrow | Not connected; no real balances or transfers |
| Example companies, projects and conversations | Demonstration data; no live company communication is implied |
The readiness indicator on newly published projects measures completion of the brief, not independent AI verification. With OpenAI enabled, the builder explains what project data will be sent, handles connection errors and lets the user explicitly continue with local questions.
Quick start
Requirements: Flutter compatible with Dart ^3.11.4, an Android SDK/device or Chrome. OpenAI integration additionally needs Node.js 22+.
git clone https://github.com/BAITC-Hacks/hack-3228a77c-it-forge.git
cd hack-3228a77c-it-forge
flutter pub get
flutter devices
flutter run -d <device-id>
For web:
flutter run -d chrome
For live AI, follow OpenAI setup. The key belongs in the ignored server environment file. It is never compiled into the Flutter application.
Architecture
flowchart TD
UI[Flutter feature screens] <--> S[WorkspaceStore]
S <--> P[Device persistence]
B[Challenge studio] --> L[Local clarification service]
B --> C[Optional HTTP client]
C --> N[Loopback Node companion]
N --> O[OpenAI Responses API]
lib/
├── app/ App shell, theme, responsive navigation
├── core/
│ ├── services/ Local questions and optional AI client
│ └── state/ Shared workspace and persistence
├── features/
│ ├── challenges/ Builder, detail and application
│ ├── home/ Discovery, search and filters
│ └── workspace/ Responses, tasks, chat and profiles
├── shared/ Models, demo data and reusable UI
└── main.dart
assets/fonts/ Bundled Manrope and its OFL license
server/ Local OpenAI adapter and tests
test/ State, persistence and UI workflow tests
designappwai2/ Updated reference design; not app runtime
Flutter uses Material widgets and local state primitives with a shared ChangeNotifier store. Tabs retain their state. Writes are serialized, persistence errors are surfaced and damaged stored data is not automatically overwritten.
Verification
flutter analyze
flutter test
node --test server/server.test.mjs
flutter build apk --debug --target-platform android-arm64
Tests cover saved data round trips, duplicate applications, task status transitions, malformed storage, relevant clarification questions, search, mobile navigation, retained chat, edited specification publication and wide-screen layout. Server tests use mocked responses and make no paid API calls.
A practical walkthrough:
- Open Profile → Кәсіпкер → Жаңа тапсырма.
- Enter a flower-delivery project, a problem, a budget and a duration.
- Select multiple catalog options and add a custom requirement.
- Complete the other steps, edit the final specification and publish.
- Open the published card from discovery.
- Switch to the student role, apply and inspect Жауаптар.
- Return to business mode and accept the application.
- Submit a solution from Тапсырмалар, then review it in business mode.
- Send a message, switch tabs and restart the app to check retention.
Before a public release
The local demo needs authenticated server accounts, a shared database, authorized company messaging, attachment storage and a deployed HTTPS AI backend before supporting real independent users. The included Node server is loopback-only development infrastructure. Android still uses the example application ID and development signing.
The design reference is preserved separately. Its web code and example API configuration are not consumed by Flutter.
Built for the AI SANA practical hackathon case. The product is Work.ai.
Авторы коммитов
История коммитов
- 2026-09-23 17:37Change project name to 'AI Sana Challenge Hub'beksu1ltan
- 2026-09-23 17:28Revise README for improved project overview and detailsbeksu1ltan
- 2026-09-23 17:256Nurislam0707
- 2026-09-23 17:05Merge branch 'main' of https://github.com/BAITC-Hacks/hack-3228a77c-it-forgeNurislam0707
- 2026-09-23 17:055Nurislam0707
- 2026-09-23 16:23docs: correct product name to Work.aiNurislam0707
- 2026-09-23 16:22docs: add SANA product READMENurislam0707
- 2026-09-23 16:194Nurislam0707
Все коммиты (13)
- 2026-09-23 16:10Merge main into Flutter implementationNurislam0707
- 2026-09-23 16:073Nurislam0707
- 2026-09-23 15:072Nurislam0707
- 2026-09-23 13:53первыйNurislam0707
- 2026-09-23 13:46первыйNurislam0707
Структура репозитория (186 файлов)
.gitignore .metadata README.md analysis_options.yaml android/.gitignore android/app/build.gradle.kts android/app/src/debug/AndroidManifest.xml android/app/src/main/AndroidManifest.xml android/app/src/main/kotlin/com/example/wai/MainActivity.kt android/app/src/main/res/drawable-v21/launch_background.xml android/app/src/main/res/drawable/launch_background.xml android/app/src/main/res/mipmap-hdpi/ic_launcher.png android/app/src/main/res/mipmap-mdpi/ic_launcher.png android/app/src/main/res/mipmap-xhdpi/ic_launcher.png android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png android/app/src/main/res/values-night/styles.xml android/app/src/main/res/values/styles.xml android/app/src/profile/AndroidManifest.xml android/build.gradle.kts android/gradle.properties android/gradle/wrapper/gradle-wrapper.properties android/settings.gradle.kts assets/fonts/Inter-OFL.txt assets/fonts/Inter.ttf assets/fonts/Manrope-OFL.txt assets/fonts/Manrope.ttf assets/fonts/PlusJakartaSans-OFL.txt assets/fonts/PlusJakartaSans.ttf deisgnappwai/.env.example deisgnappwai/.gitignore deisgnappwai/README.md deisgnappwai/bun.lock deisgnappwai/index.html deisgnappwai/metadata.json deisgnappwai/package.json deisgnappwai/src/App.tsx deisgnappwai/src/components/FlutterCodeViewer.tsx deisgnappwai/src/components/MobileSimulator.tsx deisgnappwai/src/flutter_code_data.ts deisgnappwai/src/index.css deisgnappwai/src/main.tsx deisgnappwai/tsconfig.json deisgnappwai/vite.config.ts ios/.gitignore ios/Flutter/AppFrameworkInfo.plist ios/Flutter/Debug.xcconfig ios/Flutter/Release.xcconfig ios/Runner.xcodeproj/project.pbxproj ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme ios/Runner.xcworkspace/contents.xcworkspacedata ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings ios/Runner/AppDelegate.swift ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/AppIcon.appiconset/[email protected] ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png ios/Runner/Assets.xcassets/LaunchImage.imageset/[email protected] ios/Runner/Assets.xcassets/LaunchImage.imageset/[email protected] ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md ios/Runner/Base.lproj/LaunchScreen.storyboard ios/Runner/Base.lproj/Main.storyboard ios/Runner/Info.plist ios/Runner/Runner-Bridging-Header.h ios/Runner/SceneDelegate.swift ios/RunnerTests/RunnerTests.swift lib/app/theme/app_colors.dart lib/app/theme/app_theme.dart lib/app/work_ai_app.dart lib/core/services/ai_challenge_service.dart lib/core/services/task_clarification_service.dart lib/features/challenges/challenge_builder_screen.dart lib/features/challenges/challenge_detail_screen.dart lib/features/home/discovery_screen.dart lib/features/workspace/workspace_screens.dart lib/l10n/README.md lib/l10n/app_language.dart lib/l10n/catalog.json lib/l10n/catalog_kk.json lib/l10n/translations.dart lib/main.dart lib/models/job_challenge.dart lib/screens/application_form_screen.dart lib/screens/auth_screen.dart lib/screens/chat_screen.dart lib/screens/employer_profile_screen.dart lib/screens/home_feed_screen.dart lib/screens/new_task_screen.dart lib/screens/responses_screen.dart lib/screens/student_profile_screen.dart lib/screens/tasks_screen.dart lib/screens/vacancy_detail_screen.dart lib/shared/data/demo_data.dart lib/shared/models/challenge.dart lib/shared/widgets/app_widgets.dart lib/shared/widgets/navigation_icon.dart lib/theme/app_theme.dart lib/widgets/ai_task_clarification_dialog.dart linux/.gitignore linux/CMakeLists.txt linux/flutter/CMakeLists.txt linux/flutter/generated_plugin_registrant.cc linux/flutter/generated_plugin_registrant.h linux/flutter/generated_plugins.cmake linux/runner/CMakeLists.txt linux/runner/main.cc linux/runner/my_application.cc linux/runner/my_application.h macos/.gitignore macos/Flutter/Flutter-Debug.xcconfig macos/Flutter/Flutter-Release.xcconfig macos/Flutter/GeneratedPluginRegistrant.swift macos/Runner.xcodeproj/project.pbxproj macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme macos/Runner.xcworkspace/contents.xcworkspacedata macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist macos/Runner/AppDelegate.swift macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png macos/Runner/Base.lproj/MainMenu.xib macos/Runner/Configs/AppInfo.xcconfig macos/Runner/Configs/Debug.xcconfig macos/Runner/Configs/Release.xcconfig macos/Runner/Configs/Warnings.xcconfig macos/Runner/DebugProfile.entitlements macos/Runner/Info.plist macos/Runner/MainFlutterWindow.swift macos/Runner/Release.entitlements macos/RunnerTests/RunnerTests.swift pubspec.lock pubspec.yaml test/design_screens_test.dart test/localization_test.dart test/new_task_flow_test.dart test/widget_test.dart tool/generate_localizations.py web/favicon.png web/icons/Icon-192.png web/icons/Icon-512.png web/icons/Icon-maskable-192.png web/icons/Icon-maskable-512.png web/index.html web/manifest.json windows/.gitignore windows/CMakeLists.txt windows/flutter/CMakeLists.txt windows/flutter/generated_plugin_registrant.cc windows/flutter/generated_plugin_registrant.h windows/flutter/generated_plugins.cmake windows/runner/CMakeLists.txt windows/runner/Runner.rc windows/runner/flutter_window.cpp windows/runner/flutter_window.h windows/runner/main.cpp windows/runner/resource.h windows/runner/resources/app_icon.ico windows/runner/runner.exe.manifest windows/runner/utils.cpp windows/runner/utils.h windows/runner/win32_window.cpp windows/runner/win32_window.h
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.