О проекте
Команда: 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Город один. Решений — пять.
Распределите бюджет Астаны и увидьте, кому ваши решения помогут больше всего.
HackAlem AI 2026 · Спец-трек Astana Innovations · Команда g4ymers
Проверить за 90 секунд · Скриншоты · Запустить локально · Деплой на сервер · Что работает

Один город. Два кабинета. Общая база решений и обращений.
Реальный экран приложения: готовый пример из задания, 95 из 100 единиц бюджета, Score 52.56 → 56.54.
Школа в Нуре, чистое топливо в Сарыарке, освещение улиц — у каждого решения есть цена и срок, а у районов разные потребности. E-AkimAI позволяет проверить такой выбор до того, как он станет расходом городского бюджета.
Вы выбираете пять инициатив на интерактивной карте. Симулятор проверяет ограничения, рассчитывает эффект и показывает изменения по районам. Формула учитывает и общий результат, и самый слабый район: развитие одного центра не компенсирует все оставшиеся проблемы.
Житель отмечает проблему на карте → аким видит обращение → проверяет варианты развития города. Оба кабинета используют общую базу и единый тёмный интерфейс E-AkimAI. Создать обращение можно в три шага, без QR-кода.
100 единиц бюджета · 5 районов · 14 мероприятий · 10 показателей · 2 года моделирования
Числовые данные синтетические, из задания хакатона. Результат описывает учебную модель, а не прогноз реального развития Астаны.
Приложение в действии
Скриншоты сделаны в работающем приложении. Нажмите на изображение, чтобы рассмотреть интерфейс.
Аким: пять решений и понятная проверка плана
Житель: обращение начинается с точки на карте
Место → описание → проверка → отправка. QR-код необязателен. После отправки заявка появляется в личном списке и кабинете акима, а рейтинг района учитывает новую проблему.
Гайд внутри кабинета акима
Кнопка «Как пользоваться» открывает пять коротких разделов и позволяет сразу перейти к нужной панели.
Проверьте результат за 90 секунд
После запуска откройте кабинет акима и войдите своей локальной учётной записью.
- На стартовом экране нажмите «Попробовать готовый пример». Приложение выберет пять мер за 95 единиц. Для собственного плана нажмите «Начать сценарий».
- Просмотрите инициативы и выбранный план в одной панели → «Проверить план». Здесь видны районы, стоимость и предварительный Score.
- Нажмите «Завершить и сохранить». Откроется итог: Score, изменения по районам, критические показатели и объяснение расчёта.
- Перезагрузите страницу → «Сохранённые». Откройте сценарий: решения и результат сохранены в PostgreSQL.
| Что проверяем | До | После |
|---|---|---|
| Astana Quality of Life Score | 52.56 | 56.54 |
| Показатели ниже критического порога 40 | 2 | 0 |
| Расход бюджета | 0 | 95 из 100 |
| Принятые решения | 0 | 5 из 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 симуляции, а выбор мероприятия не закрывает обращение автоматически. Коэффициенты рейтинга — прозрачная стартовая настройка, не официальная оценка районов.
Сценарий проверки: житель → аким
- В кабинете жителя откройте «Сообщить о проблеме» → карту. Укажите точку в одном из пяти районов, заполните адрес и подтвердите место.
- Добавьте описание, направление и срочность → «Проверить обращение» → «Отправить обращение». Камера, GPS и QR для этого пути не нужны.
- Откройте «Мои обращения»: заявка находится в личном списке. Активные обращения других жителей скрыты; публичный журнал показывает решённые.
- В кабинете акима откройте «Обращения», выберите район и обработайте заявку. Проверьте её статус у жителя через «Обновить список».
- В панели района акима посмотрите рейтинг по обращениям, а в «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 устанавливаются внутри контейнеров.
- Скопируйте
.env.exampleв.env. Задайте своиDATABASE_PASSWORD,AKIM_EMAILиAKIM_PASSWORD— пароль акима минимум 12 символов. - Запустите сервер и базу:
docker compose up --build -d
- Запустите фронтенд отдельно:
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; интерактивная карта в обоих кабинетах, сценарии акима и обращения жителя |
| Общий backend | Java 21, Spring Boot 4, Spring Security; роли, обращения, валидация, расчёт и аналитика |
| ML | Multinomial 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 | Реализация формулы и валидации |
| Миграция датасета | Исходные показатели и каталог мероприятий |
| Аналитика | Рейтинг обращений, классификатор тем и рекомендации |
| Тесты модели | Воспроизводимый контрольный сценарий и ограничения |
Источники
- Задание «Аким на 5 часов» — требования и критерии оценки.
- Датасет районов — синтетические показатели, меры, веса и формула.
- Карта: предоставленный SVG на основе © OpenStreetMap contributors, ODbL. Происхождение геометрии и подготовка подложки описаны в документации карты.
E-AkimAI · g4ymers · HackAlem AI 2026 · Astana Innovations
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.


