AAYMA
RU
Войти

E-AkimAI

Симулятор бюджета Астаны с кабинетом акима (выбор 5 инициатив на карте, расчёт Score по районам, сохранение сценариев) и кабинетом жителя для…

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

О проекте

Команда: g4ymers
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Рабочий MVP

Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам

Суть

Симулятор бюджета Астаны с кабинетом акима (выбор 5 инициатив на карте, расчёт Score по районам, сохранение сценариев) и кабинетом жителя для обращений о проблемах с меткой на карте.

Как устроено

Java-бэкенд (Spring, Flyway, PostgreSQL) хранит 5 районов, 10 показателей и 14 мероприятий. Simulator считает показатели районов, Score, лаги, синергии и критические значения и проверяет ограничения, например несовместимость M1 и M3. Два фронтенда на Next.js (аким и житель) работают через общий API. Обращения жителей идут в рейтинг районов, а наивный байесовский классификатор, обученный на 32 синтетических примерах, определяет тему жалобы и группирует рекомендации по адресам. Объяснения сценария строятся правилами, внешняя LLM не подключена.

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

  • Naive Bayes topic classifier
  • rule-based explanations
  • Flyway migrations
  • constraint validation

Метрики

Пример ТЗ: Score 52.56 → 56.54, 95/100 у.е., критических показателей 2 → 0

Особенности

Помимо симулятора есть второй кабинет, для жителей: обращения с точкой на карте поступают акиму и влияют на рейтинг районов. Команда явно пишет, что LLM-разбор не подключён, и честно описывает, что делает AI.

Стек

Java 21 · Spring · Maven · PostgreSQL · Flyway · Next.js · React · TypeScript · Docker Compose · PowerShell


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

README

README.md
E-AkimAI

Город один. Решений — пять.

Распределите бюджет Астаны и увидьте, кому ваши решения помогут больше всего.

HackAlem AI 2026 · Спец-трек Astana Innovations · Команда g4ymers

Проверить за 90 секунд · Скриншоты · Запустить локально · Деплой на сервер · Что работает

Работающий E-AkimAI: карта Астаны, пять выбранных инициатив и предварительный Score 56.54.

Один город. Два кабинета. Общая база решений и обращений.
Реальный экран приложения: готовый пример из задания, 95 из 100 единиц бюджета, Score 52.56 → 56.54.

Школа в Нуре, чистое топливо в Сарыарке, освещение улиц — у каждого решения есть цена и срок, а у районов разные потребности. E-AkimAI позволяет проверить такой выбор до того, как он станет расходом городского бюджета.

Вы выбираете пять инициатив на интерактивной карте. Симулятор проверяет ограничения, рассчитывает эффект и показывает изменения по районам. Формула учитывает и общий результат, и самый слабый район: развитие одного центра не компенсирует все оставшиеся проблемы.

Житель отмечает проблему на карте → аким видит обращение → проверяет варианты развития города. Оба кабинета используют общую базу и единый тёмный интерфейс E-AkimAI. Создать обращение можно в три шага, без QR-кода.

100 единиц бюджета · 5 районов · 14 мероприятий · 10 показателей · 2 года моделирования

Числовые данные синтетические, из задания хакатона. Результат описывает учебную модель, а не прогноз реального развития Астаны.

Приложение в действии

Скриншоты сделаны в работающем приложении. Нажмите на изображение, чтобы рассмотреть интерфейс.

Аким: пять решений и понятная проверка плана

Проверка сценария: выбранные инициативы, бюджет и предварительный Score перед сохранением.

Житель: обращение начинается с точки на карте

Карта жителя: выбран Байтерек в районе Есиль, место и адрес подтверждаются перед описанием проблемы.

Место → описание → проверка → отправка. QR-код необязателен. После отправки заявка появляется в личном списке и кабинете акима, а рейтинг района учитывает новую проблему.

Гайд внутри кабинета акима

Встроенный гайд: сценарий, обращения, рейтинги, AI-советы и управление картой.

Кнопка «Как пользоваться» открывает пять коротких разделов и позволяет сразу перейти к нужной панели.

Проверьте результат за 90 секунд

После запуска откройте кабинет акима и войдите своей локальной учётной записью.

  1. На стартовом экране нажмите «Попробовать готовый пример». Приложение выберет пять мер за 95 единиц. Для собственного плана нажмите «Начать сценарий».
  2. Просмотрите инициативы и выбранный план в одной панели → «Проверить план». Здесь видны районы, стоимость и предварительный Score.
  3. Нажмите «Завершить и сохранить». Откроется итог: Score, изменения по районам, критические показатели и объяснение расчёта.
  4. Перезагрузите страницу → «Сохранённые». Откройте сценарий: решения и результат сохранены в PostgreSQL.
Что проверяемДоПосле
Astana Quality of Life Score52.5656.54
Показатели ниже критического порога 4020
Расход бюджета095 из 100
Принятые решения05 из 5

Контрольный набор: M7 — школа и детсад, M8 — поликлиника, M10 — освещение и камеры в Нуре; M12 — цифровые обращения по городу; M5 — чистое топливо в Сарыарке. Это пример из датасета, а не заявление об оптимальном наборе мер.

Для проверки чувствительности модели начните новый сценарий и измените меры или район. Для проверки ограничений попробуйте совместить автобусные полосы M1 и ЛРТ M3: система объяснит, почему набор недопустим.

Почему это полезно

  • Решения имеют видимые последствия. Карта связывает инициативы с конкретными районами, а сравнение показывает, где выросли показатели и где сохранились проблемы.
  • Компромиссы входят в модель. Учтены стоимость, задержка эффекта, синергии, несовместимости и отрицательные последствия отдельных мер.
  • Результат можно воспроизвести. Одинаковые исходные данные и решения дают одинаковый Score. Сценарии сохраняются и доступны для повторного просмотра.
  • Жители показывают, где нужна помощь. Обращения поступают в общий кабинет акима; рейтинг по обращениям и ML-рекомендации выделяют проблемные адреса.

Что работает в этой версии

Часть проектаСостояние
Карта АстаныПять районов ТЗ, ориентиры, масштабирование, поворот и плавный фокус в обоих кабинетах; у акима карта на весь экран
Кабинет акимаВход, серверный каталог, выбор инициатив, бюджет и проверка ограничений
Гайд акима«Как пользоваться»: сценарий, обращения, два рейтинга, AI-советы и карта; переходы в нужные панели без изменения плана
Расчёт результатаJava: показатели районов, Score, лаги, синергии и критические значения
СценарииПредпросмотр, сохранение, повторное открытие и завершение с фиксацией результата
Обращения в кабинете акимаПросмотр, фильтры, смена статуса и история через общий API
Кабинет жителяВход по ИИН; карта → описание → проверка и отправка. QR остаётся дополнительным способом выбрать место
Обращения жителяСвои заявки со статусами и фильтрами, публичный журнал решённых проблем, карточки, комментарии и профиль через общий API
Карта обращенийОтметки собственных обращений и публичных решённых проблем; район определяется по выбранной точке
Единый стильЛоготип E-AkimAI, тёмный фон, синие и бирюзовые акценты, адаптивные панели и обучение в обоих кабинетах
Рейтинг по обращениямДанные PostgreSQL: активные проблемы снижают оценку, решённые снимают нагрузку и дают ограниченный бонус
ML-рекомендацииNaive Bayes определяет тему жалоб; рекомендации группируются по адресам и числу разных жителей
LLM-разбор сценарияВнешняя LLM пока не подключена; объяснения результата формируются правилами

Что делает AI сейчас: локальный классификатор обучается на 32 синтетических примерах по 8 темам и предлагает действия для повторяющихся проблем по конкретным адресам. При низкой уверенности требуется проверка на месте. Качество на реальных обращениях ещё не оценено. Панель «Предложения ИИ» показывает эти рекомендации; внешний AI API для неё не нужен.

Численный Score рассчитывается кодом. Серверные explanations формируются правилами. LLM, которая объясняет сильные стороны и компромиссы сценария по готовым числам, остаётся отдельным этапом интеграции.

Обращения и симулятор используют общий backend. Рейтинг по обращениям и сценарный Score — разные оценки: обращение само по себе не изменяет Score симуляции, а выбор мероприятия не закрывает обращение автоматически. Коэффициенты рейтинга — прозрачная стартовая настройка, не официальная оценка районов.

Сценарий проверки: житель → аким

  1. В кабинете жителя откройте «Сообщить о проблеме» → карту. Укажите точку в одном из пяти районов, заполните адрес и подтвердите место.
  2. Добавьте описание, направление и срочность → «Проверить обращение» → «Отправить обращение». Камера, GPS и QR для этого пути не нужны.
  3. Откройте «Мои обращения»: заявка находится в личном списке. Активные обращения других жителей скрыты; публичный журнал показывает решённые.
  4. В кабинете акима откройте «Обращения», выберите район и обработайте заявку. Проверьте её статус у жителя через «Обновить список».
  5. В панели района акима посмотрите рейтинг по обращениям, а в «AI» — предложения по темам и адресам. Эффект выбранных инициатив проверяется отдельно, в сценарии развития.

Запуск

Основной сценарий проверки — кабинет акима + Java API + PostgreSQL. Команды выполняются из корня скачанного или клонированного репозитория, если не указан переход в другую папку.

Вариант 1. Windows — проверенный локальный путь

Нужны Node.js 22.18+, Java 21+, PostgreSQL 18 и PowerShell 7. Maven загружается через wrapper. При первой установке зависимостей требуется интернет.

В первом терминале PowerShell 7:

.\backend\scripts\start-local-db.ps1
cd backend
.\mvnw.cmd package
cd ..
.\backend\scripts\start-api.ps1

Скрипт создаст отдельную локальную БД на порту 55432. Flyway автоматически загрузит 5 районов, 10 показателей и 14 мероприятий. Если PostgreSQL установлен по другому пути, передайте -PostgresBin 'D:\PostgreSQL\18\bin' первому скрипту.

Во втором терминале, из корня:

cd akim
npm ci
npm run dev

Откройте http://localhost:3000. Email и пароль акима создаются при первом запуске и находятся в полях akimEmail и akimPassword файла .local/dev-config.json. Файл локальный и исключён из Git. Регистрировать жителя для входа в кабинет акима не нужно.

Проверка доступности API и БД: http://localhost:8080/api/health.

Вариант 2. PostgreSQL и API через Docker Compose

Нужны Docker Compose и Node.js 22.18+. Java и PostgreSQL устанавливаются внутри контейнеров.

  1. Скопируйте .env.example в .env. Задайте свои DATABASE_PASSWORD, AKIM_EMAIL и AKIM_PASSWORD — пароль акима минимум 12 символов.
  2. Запустите сервер и базу:
docker compose up --build -d
  1. Запустите фронтенд отдельно:
cd akim
npm ci
npm run dev

Адрес кабинета: localhost:3000. Данные для входа — AKIM_EMAIL и AKIM_PASSWORD из вашего .env. API: localhost:8080, PostgreSQL: localhost:5433.

Compose описывает только API и БД. Этот вариант подготовлен в репозитории; основной проверенный запуск выполнялся через локальный PostgreSQL на Windows. Одновременно запускать оба варианта на порту 8080 не нужно.

Кабинет жителя и адрес другого backend

Для запуска кабинета жителя из корня:

cd citizen/my-app
npm ci
npm run dev -- --port 3001

Откройте localhost:3001/citizen. Житель регистрируется и входит по ИИН и паролю; это учётная запись приложения, без проверки личности через eGov. Данные загружаются из общего API, ошибки не подменяются демоданными. Сессии жителя и акима независимы.

Основной путь создания заявки — карта города: место → описание → проверка и отправка. QR-код необязателен. На карте показаны собственные обращения и публичные решённые проблемы. Подробности — в README кабинета жителя.

Для наполненной демонстрации доступны 25 синтетических жителей, 5 QR-точек и 75 обращений. Они создаются только при явном включении DEMO_RESIDENTS=true и заданном DEMO_RESIDENT_PASSWORD в окружении backend. Настройка и тестовые QR описаны в документации backend.

Кабинет акима обращается к http://127.0.0.1:8080 через сервер Next.js. Для другого адреса создайте akim/.env.local:

BACKEND_URL=http://127.0.0.1:8080

После изменения перезапустите фронтенд. Браузер использует /api/backend/...; Bearer-токен хранится в HttpOnly-cookie и передаётся Java API сервером Next.js. Production-вариант требует HTTPS для защищённой cookie.

Тот же BACKEND_URL можно задать в citizen/my-app/.env.local. Для необязательных камеры и геолокации в QR-сценарии на телефоне нужен HTTPS; путь через карту их не запрашивает. Загрузка фотографий пока не реализована.

Деплой на сервер

Полный пошаговый гайд → docs/DEPLOYMENT.md

Основной путь — Ubuntu VPS + Docker Compose + Caddy с HTTPS. На сервере работают PostgreSQL, Java API и два Next.js-приложения. Кабинеты открываются на отдельных поддоменах, а API и база доступны внутри контейнерной сети.

В гайде: подготовка сервера и DNS, установка Docker, заполнение переменных окружения, первый запуск и вход акима, проверка работоспособности, логи, обновление, резервные копии, восстановление и типичные ошибки.

Для хостинга нужны два работающих Next.js-сервера: авторизация использует серверный BFF и HttpOnly-cookie. Статического экспорта недостаточно. В production требуется HTTPS. Локальный compose.yml запускает API и БД; полный серверный стек описан отдельно в deploy/.

Архитектура

flowchart LR
    A[Кабинет акима · Next.js] --> B[Next.js BFF · HttpOnly-cookie]
    B --> C[Java 21 · Spring Boot]
    C --> D[(PostgreSQL · Flyway)]
    C --> E[Валидатор + расчёт Score]
    F[Кабинет жителя · Next.js] --> H[Next.js BFF · citizen cookie]
    H --> C
    C --> I[Рейтинг обращений + Naive Bayes]
    E -. планируется .-> G[LLM · объяснение сценария]

Пунктиром обозначен запланированный LLM-разбор; оба кабинета и локальный ML используют общий работающий API.

СлойТехнологии и ответственность
ИнтерфейсыNext.js 16, React 19, TypeScript; интерактивная карта в обоих кабинетах, сценарии акима и обращения жителя
Общий backendJava 21, Spring Boot 4, Spring Security; роли, обращения, валидация, расчёт и аналитика
MLMultinomial Naive Bayes; обучающие примеры в PostgreSQL, группировка жалоб по теме и адресу
ХранениеPostgreSQL 18, Flyway; датасет, пользователи, обращения, история и сценарии
КартаЛокальная WebP-подложка из SVG и векторные контуры пяти районов; внешний картографический API не требуется

Как считается результат

Score = 0.7 × средняя оценка по населению
      + 0.3 × оценка самого слабого района
      − число показателей ниже 40

Модель поощряет развитие города и поддержку отстающих районов. Каждый показатель строго ниже 40 отнимает один балл. Эффекты мероприятий учитывают задержку запуска на горизонте 8 кварталов; синергии добавляются отдельно, показатели ограничены диапазоном 0–100.

Сервер проверяет ровно 5 уникальных мер, стоимость не больше 100, не больше 2 мер одного направления, обязательный район локальной меры и все несовместимости. Черновик допускает меньше пяти мер, завершение — только полный допустимый набор. Выбирать по одной мере каждого направления не требуется.

Контрольные значения без округления: исходный Score 52.55768, пример из задания 56.54307. Округление применяется при отображении.

Проверки и код

Фронтенд и тесты модели:

cd akim
npm ci
npm test
npm run lint
npm run build

Тесты Java из папки backend: ./mvnw test на Linux/macOS или .\mvnw.cmd test на Windows. Настройка тестов с настоящей БД описана в документации backend. HTTP-тесты требуют отдельного запуска окружения; обычный запуск тестов не означает прохождения интеграционных проверок.

HTTP-тесты фронтенда акима включаются через AKIM_API_TEST=1, AKIM_TEST_EMAIL и AKIM_TEST_PASSWORD для отдельной тестовой учётной записи; необязательный AKIM_FRONTEND_URL по умолчанию равен http://localhost:3000. Проверки жителя и цепочки «обращение → аким → рейтинг → решение» запускаются последовательно командой npm run test:integration из citizen/my-app с переменными из инструкции тестирования. Оба frontend должны обращаться к одному отдельному тестовому backend и БД: проверки создают жителей, обращения и сценарии.

Проверяются контрольный пример, бюджет, число и уникальность мер, район воздействия, ограничения направлений, несовместимости, лаги, синергии и критический порог.

Где смотретьСодержимое
akim/Кабинет акима, карта, BFF и инструкции по интеграции
backend/Общий API, авторизация, расчёт, сценарии, рейтинг и ML
citizen/my-app/Карта, форма обращения, личный список, публичный журнал и обучение жителя
Simulator.javaРеализация формулы и валидации
Миграция датасетаИсходные показатели и каталог мероприятий
АналитикаРейтинг обращений, классификатор тем и рекомендации
Тесты моделиВоспроизводимый контрольный сценарий и ограничения

Источники

E-AkimAI · g4ymers · HackAlem AI 2026 · Astana Innovations

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
29
Авторы
4
Файлы
173
Ветки
1

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

zhanssss 16bekzhankb 7olzhasakhonov 5zhanssss 1

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

  • 2026-09-23 17:59readme updatezhanssss
  • 2026-09-23 17:57last updatezhanssss
  • 2026-09-23 17:36bug fix 17:35zhanssss
  • 2026-09-23 17:35bug fixzhanssss
  • 2026-09-23 17:30gide for citizensolzhasakhonov
  • 2026-09-23 17:225:22zhanssss
  • 2026-09-23 17:21readme updzhanssss
  • 2026-09-23 17:20ui changes in akimzhanssss
Все коммиты (29)
  • 2026-09-23 17:10backend for citizenolzhasakhonov
  • 2026-09-23 16:29readme updbekzhankb
  • 2026-09-23 16:23citizen mobilezhanssss
  • 2026-09-23 16:22connected backend and front for akimzhanssss
  • 2026-09-23 16:21citizen mobile app 2.0olzhasakhonov
  • 2026-09-23 16:19readme updatebekzhankb
  • 2026-09-23 16:11logo svg updbekzhankb
  • 2026-09-23 15:50merge origin/mainzhanssss
  • 2026-09-23 15:44backend 3:44zhanssss
  • 2026-09-23 15:41dadwbekzhankb
  • 2026-09-23 15:39logo in .svgbekzhankb
  • 2026-09-23 15:35qqqbekzhankb
  • 2026-09-23 15:25qqqbekzhankb
  • 2026-09-23 15:073:07 testzhanssss
  • 2026-09-23 15:0415:04 safety commitzhanssss
  • 2026-09-23 15:03frontend for citizensolzhasakhonov
  • 2026-09-23 14:09readme updatezhanssss
  • 2026-09-23 14:08Akim front прототипzhanssss
  • 2026-09-23 12:11Update README.mdzhanssss
  • 2026-09-23 11:44islamzhanssss
  • 2026-09-23 11:34Olzhasolzhasakhonov
Структура репозитория (173 файлов)
.DS_Store
.env.example
.gitignore
HackAlem AI_ «Аким на 5 часов» - AI-симулятор управления городом.pdf
README.md
akim/.gitignore
akim/AGENTS.md
akim/CLAUDE.md
akim/README.md
akim/app/akim-guide.css
akim/app/api/backend/[...path]/route.ts
akim/app/backend-ui.css
akim/app/brand-theme.css
akim/app/favicon.ico
akim/app/globals.css
akim/app/immersive-map.css
akim/app/layout.tsx
akim/app/map-workspace.css
akim/app/page.tsx
akim/app/scenario-flow.css
akim/components/akim-guide.tsx
akim/components/auth-gate.tsx
akim/components/brand-logo.tsx
akim/components/city-map.tsx
akim/components/district-insights.tsx
akim/components/icon.tsx
akim/components/reports-panel.tsx
akim/components/scenario-flow.tsx
akim/components/scenario-library.tsx
akim/components/workspace.tsx
akim/eslint.config.mjs
akim/lib/api.ts
akim/lib/astana-map.json
akim/lib/simulation.ts
akim/logoinsvg.svg
akim/next.config.ts
akim/package-lock.json
akim/package.json
akim/postcss.config.mjs
akim/public/brand/logo.svg
akim/public/brand/mark.svg
akim/public/file.svg
akim/public/globe.svg
akim/public/maps/astana.svg
akim/public/maps/astana.webp
akim/public/next.svg
akim/public/vercel.svg
akim/public/window.svg
akim/scripts/prepare-map.py
akim/scripts/render-map.mjs
akim/tests/api.integration.test.mjs
akim/tests/simulation.test.mjs
akim/tsconfig.json
backend/.dockerignore
backend/.mvn/wrapper/maven-wrapper.properties
backend/Dockerfile
backend/README.md
backend/mvnw
backend/mvnw.cmd
backend/pom.xml
backend/scripts/seed.mjs
backend/scripts/start-api.ps1
backend/scripts/start-local-db.ps1
backend/scripts/test-integration.ps1
backend/src/main/java/kz/hackalem/city/CityApplication.java
backend/src/main/java/kz/hackalem/city/analytics/AnalyticsController.java
backend/src/main/java/kz/hackalem/city/analytics/DistrictRating.java
backend/src/main/java/kz/hackalem/city/analytics/TopicClassifier.java
backend/src/main/java/kz/hackalem/city/auth/AuthController.java
backend/src/main/java/kz/hackalem/city/auth/AuthService.java
backend/src/main/java/kz/hackalem/city/auth/DemoResidents.java
backend/src/main/java/kz/hackalem/city/auth/SecurityConfig.java
backend/src/main/java/kz/hackalem/city/common/ApiErrors.java
backend/src/main/java/kz/hackalem/city/common/ApiException.java
backend/src/main/java/kz/hackalem/city/common/Json.java
backend/src/main/java/kz/hackalem/city/reports/QrController.java
backend/src/main/java/kz/hackalem/city/reports/ReportController.java
backend/src/main/java/kz/hackalem/city/reports/ReportService.java
backend/src/main/java/kz/hackalem/city/simulation/Catalog.java
backend/src/main/java/kz/hackalem/city/simulation/ScenarioController.java
backend/src/main/java/kz/hackalem/city/simulation/SimulationController.java
backend/src/main/java/kz/hackalem/city/simulation/Simulator.java
backend/src/main/resources/application.yml
backend/src/main/resources/db/migration/V1__schema.sql
backend/src/main/resources/db/migration/V2__hackathon_dataset.sql
backend/src/main/resources/db/migration/V3__citizen_identity_and_analytics.sql
backend/src/test/java/kz/hackalem/city/AnalyticsTest.java
backend/src/test/java/kz/hackalem/city/ApiIntegrationTest.java
backend/src/test/java/kz/hackalem/city/SimulatorTest.java
backend/src/test/resources/dataset.json
citizen/.DS_Store
citizen/my-app/.env.example
citizen/my-app/.gitignore
citizen/my-app/AGENTS.md
citizen/my-app/CLAUDE.md
citizen/my-app/README.md
citizen/my-app/app/api/backend/[...path]/route.ts
citizen/my-app/app/brand-theme.css
citizen/my-app/app/citizen-map.css
citizen/my-app/app/citizen/help/page.tsx
citizen/my-app/app/citizen/layout.tsx
citizen/my-app/app/citizen/map/page.tsx
citizen/my-app/app/citizen/my-reports/page.tsx
citizen/my-app/app/citizen/page.tsx
citizen/my-app/app/citizen/problems/[id]/page.tsx
citizen/my-app/app/citizen/problems/page.tsx
citizen/my-app/app/citizen/profile/page.tsx
citizen/my-app/app/citizen/report/page.tsx
citizen/my-app/app/citizen/scan/page.tsx
citizen/my-app/app/favicon.ico
citizen/my-app/app/globals.css
citizen/my-app/app/layout.tsx
citizen/my-app/app/onboarding.css
citizen/my-app/app/page.tsx
citizen/my-app/app/report/[qrCode]/page.tsx
citizen/my-app/components/citizen/auth-provider.tsx
citizen/my-app/components/citizen/brand-logo.tsx
citizen/my-app/components/citizen/citizen-pages.tsx
citizen/my-app/components/citizen/citizen-shell.tsx
citizen/my-app/components/citizen/city-map-page.tsx
citizen/my-app/components/citizen/city-map.tsx
citizen/my-app/components/citizen/icon.tsx
citizen/my-app/components/citizen/location-permission.tsx
citizen/my-app/components/citizen/onboarding.tsx
citizen/my-app/components/citizen/problem-card.tsx
citizen/my-app/components/citizen/qr-scanner.tsx
citizen/my-app/components/citizen/report-form.tsx
citizen/my-app/components/citizen/status-timeline.tsx
citizen/my-app/docs/onboarding.md
citizen/my-app/eslint.config.mjs
citizen/my-app/lib/astana-map.json
citizen/my-app/lib/citizen-map.ts
citizen/my-app/lib/citizen.ts
citizen/my-app/lib/onboarding.ts
citizen/my-app/next.config.ts
citizen/my-app/package-lock.json
citizen/my-app/package.json
citizen/my-app/postcss.config.mjs
citizen/my-app/public/brand/logo.svg
citizen/my-app/public/brand/mark.svg
citizen/my-app/public/file.svg
citizen/my-app/public/globe.svg
citizen/my-app/public/maps/astana.webp
citizen/my-app/public/next.svg
citizen/my-app/public/vercel.svg
citizen/my-app/public/window.svg
citizen/my-app/tests/api.integration.test.mjs
citizen/my-app/tests/citizen-map.test.mjs
citizen/my-app/tests/city-flow.integration.test.mjs
citizen/my-app/tests/onboarding.test.mjs
citizen/my-app/tsconfig.json
compose.yml
deploy/.env.example
deploy/.gitignore
deploy/Caddyfile
deploy/Next.Dockerfile
deploy/Next.Dockerfile.dockerignore
deploy/compose.production.yml
docs/assets/overview.svg
docs/screenshots/akim-guide.png
docs/screenshots/akim-map.png
docs/screenshots/akim-scenario.png
docs/screenshots/citizen-map.png
logoinsvg.svg
tmp/pdfs/source-0/page-1.png
tmp/pdfs/source-0/page-2.png
tmp/pdfs/source-0/page-3.png
tmp/pdfs/source-1/page-1.png
tmp/pdfs/source-1/page-2.png
tmp/pdfs/source-1/page-3.png
tmp/pdfs/source-1/page-4.png
tmp/pdfs/source-1/page-5.png
Датасет районов.pdf

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

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

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