OmniDrive · Бортжурнал, диагностика и регламент ТО
Приложение для автомобилистов: паспорт машины, OBD-проверки, регламент обслуживания и единый бортжурнал. Работает на Android и в веб-версии (ПК и мобильный браузер) с одним интерфейсом.
Возможности
- Несколько автомобилей — карточки на аккаунт; вход в разделы только после выбора машины.
- Входящие данные — фото (слайдер, камера/галерея, несколько снимков), марка, модель, год, цвет, госномер, VIN, номер двигателя; кнопка Ai (Bothub Vision).
- Проверки — параметры OBD, сканирование ошибок, проверка по VIN. Android: Bluetooth ELM327. Web: демо-режим без адаптера. Записи уходят в бортжурнал.
- Регламент — свои действия ТО с интервалом по км и/или месяцам, обратный отсчёт (зелёный / оранжевый / красный), AI-подбор интервалов, связь с журналом.
- Бортжурнал — автозаписи из других вкладок и ручные блоки: текст, фото, видео, диктофон, файлы, AI. Теги, фильтры, архив (корзина), дата и пробег.
- Авторизация — email/пароль, JWT через EuropaServer App Auth (
appId=omnidrive). - Синхронизация — Android ↔ Web через Yandex Object Storage: LWW по
updatedAt, автосинк 10 с, кнопка «Синхронизировать», на Android — pull-to-refresh. Настройки S3 и AI общие на аккаунт. - Адаптивный UI — нижняя панель + FAB на телефоне, боковое меню на desktop (≥1024px), стеклянный тёмный градиент.
Требования
- Android: 8.0 (API 26) и выше; сборка
compileSdk/targetSdk35. JDK 17. Android Studio с AGP 8.7. - Web: Node.js 18+ (сборка локально). Браузер с localStorage.
- Auth: сервер EuropaServer с плагином App Auth.
- Синхронизация между устройствами: бакет Yandex Object Storage (ключи S3).
- OBD на Android: Bluetooth и адаптер ELM327.
- AI: сеть и API-ключ Bothub.chat (в настройках приложения, не в исходниках).
Установка и запуск
Auth API
Единый сервер — плагин App Auth на EuropaServer (appId=omnidrive):
sudo bash /home/projects/plugins/app-auth/setup.sh
Auth Base URL: http://<server-ip>/app-auth
Локально (без nginx): http://localhost:5030
Эмулятор Android → ПК: http://10.0.2.2:5030
Панель аккаунтов: http://<server-ip>/app-auth/
Сброс пароля по email временно недоступен — смена в панели /app-auth/.
Android
- Откройте проект в Android Studio.
- Синхронизируйте Gradle → Run → app.
Версия приложения: 0.1.0 (versionCode 1). Gradle Wrapper: 8.9. Kotlin: 2.1.0.
gradlew.bat assembleDebug
Web (ПК и мобильный браузер)
> Windows (PowerShell): если npm выдаёт ошибку *«выполнение сценариев отключено»*, используйте `npm.cmd` вместо npm.
Команды из папки `web/` (где лежит package.json), не из web/dist/.
cd web
npm install # Windows: npm.cmd install
npm run dev # http://localhost:5173 — только для разработки
npm run build # production в web/dist/
npm run start # http://localhost:8082 — production preview
На телефоне в той же Wi‑Fi сети: npm run dev слушает все интерфейсы — откройте http://<IP-ПК>:5173.
Деплой web на сервер (сборка локально)
Белый экран с ошибкой MIME type для main.tsx означает, что сервер отдаёт исходники (web/), а не сборку.
- Локально — собрать production:
cd web
npm ci # Windows: npm.cmd ci
npm run build # Windows: npm.cmd run build
- На сервер — скопировать только содержимое
web/dist/(scp, rsync, FTP).
- На сервере — nginx/apache с
rootна эту папку. Пример конфига —web/nginx.conf.
npm на сервере не нужен, если статику раздаёт nginx.
root должен указывать на каталог с index.html и папкой assets/ из web/dist/.
Использование
Поток: вход (email/JWT) → карточки машин → 4 вкладки.
Регистрация и вход
- Укажите Auth Base URL в настройках (или оставьте значение по умолчанию сервера).
- Зарегистрируйтесь или войдите по email и паролю.
- Клиент передаёт
appId=omnidriveв register/login.
Карточки автомобилей
- На экране списка нажмите «+» и задайте название карточки.
- Выберите машину — откроются вкладки.
- Долгое нажатие — удаление. Переключение авто и выход — из шапки / меню.
- Кнопка синка в шапке подтягивает машины и данные с других устройств.
Входящие данные
- Блок фото занимает верх экрана (~42%): свайп по слайдеру, нажатие — редактирование.
- Ниже восемь полей в фиксированном порядке: фото, марка, модель, год, цвет, госномер, VIN, номер двигателя.
- В диалоге: «Фото» / «Галерея», «Ai анализ» напротив изображения.
Проверки
- FAB «+»: Параметры OBD, Сканировать ошибки, Проверка по VIN.
- На Android сопрягите ELM327 в системном Bluetooth, затем «Старт» / «Записать».
- В web те же экраны в демо-режиме (без живого адаптера).
- Запись попадает в список проверок и в бортжурнал. Долгое нажатие — удаление.
Регламент
- Создайте действие (например «Моторное масло») с интервалом в км и/или месяцах.
- На карточке списка — блок о следующем ТО (как в деталях).
- Цвет: зелёный / оранжевый / красный; при просрочке — срочное уведомление без «осталось N дн.».
- Текущий пробег берётся из записей бортжурнала. В деталях — AI-подбор интервалов.
Бортжурнал
- Вкладки сверху: «Все записи», «Теги», «Архив».
- FAB открывает меню блоков: AI, Текст, Камера, Диктофон, Файлы.
- У записи: теги, дата и пробег (автоподстановка сегодня и max пробега / по дате из истории).
- Карточка ленты: дата слева, пробег справа, сетка вложений. Архив — восстановление или окончательное удаление.
Настройки (AI и синхронизация)
Иконка шестерёнки на основных экранах:
- Auth API Base URL, S3 endpoint / region / bucket / ключи.
- «Проверить S3» и «Синхронизировать».
- Bothub: API Key, Base URL, текстовая и vision-модели, temperature, max tokens.
Первый клиент с настроенным S3 пишет users/{userId}/account-config.json. Другие устройства с теми же ключами подтягивают S3+AI (LWW). Подробности — doc/SYNC.md.
Структура проекта
OmniDrive/
├── app/ # Android (Kotlin, Compose)
│ └── src/main/java/com/omnidrive/
│ ├── ui/ # экраны, ViewModel, навигация
│ ├── domain/ # модели, регламент, AI-интерфейсы
│ ├── data/ # Room, репозитории, Bothub, медиа
│ ├── sync/ # Auth API, Yandex S3, LWW
│ ├── obd/ # ELM327, PID, DTC
│ └── di/ # Hilt
├── web/
│ ├── src/
│ │ ├── pages/ # Auth, машины, 4 вкладки, настройки
│ │ ├── components/
│ │ ├── store/ # Zustand + localStorage
│ │ ├── lib/ # authApi, S3, syncEngine
│ │ └── domain/
│ ├── dist/ # production-сборка (не исходники)
│ └── nginx.conf
├── shared/
│ └── design-tokens.json # цвета, радиусы, вкладки
└── doc/ # ARCHITECTURE, CHANGELOG, AI_RULES, SYNC
Слои и потоки данных — в doc/ARCHITECTURE.md. Сборка web — web/README.md.
Технологии
Android (app/)
| Компонент | Зачем |
|————|———|
| Kotlin 2.1 / JDK 17 | код и JVM-цель |
| AGP 8.7.3, Gradle 8.9 | сборка :app |
| Jetpack Compose (BOM 2024.12.01), Material 3 | экраны без XML-layout |
| Navigation Compose 2.8.5 | вкладки и OBD-экраны |
| Room 2.6.1 | локальная БД (версия схемы 7) |
| Hilt 2.53.1 | DI |
| OkHttp 4.12 | Auth API и S3 SigV4 |
| Coil 2.7 | изображения |
| CameraX 1.4 | камера |
Min SDK 26 · Target SDK 35.
Web (web/)
| Компонент | Зачем |
|————|———|
| React 19 + TypeScript 5.7 | UI |
| Vite 6 | dev-сервер и production-сборка |
| Zustand 5 | состояние + persist в localStorage |
| lucide-react | иконки |
Общее
shared/design-tokens.json— единый дизайн Android + Web.- EuropaServer App Auth — учётки.
- Yandex Object Storage — данные авто, медиа,
account-config.json.
Разрешения (Android)
| Разрешение | Зачем |
|————|———|
| INTERNET | Auth, S3, Bothub |
| CAMERA | фото во входящих данных и бортжурнале |
| RECORD_AUDIO | диктофон в бортжурнале |
| READ_MEDIA_IMAGES / READ_EXTERNAL_STORAGE (до API 32) | галерея |
| BLUETOOTH (maxSdk 30), BLUETOOTH_CONNECT, BLUETOOTH_SCAN | ELM327 |
usesCleartextTraffic включён для локального Auth (http://10.0.2.2:5030). FileProvider — сохранение снимков камеры.
Настройка API и ключей
Ключи не кладутся в репозиторий.
- Auth — URL плагина App Auth в поле «Auth API Base URL».
- S3 — endpoint, region, bucket, access/secret key. CORS бакета: Origin сайта, GET/PUT/HEAD, заголовки
*. - Bothub — Access Token и Base URL (по умолчанию
https://bothub.chat/api/v2/openai/v1). Модели по умолчанию: текстgemini-2.0-flash-001, visiongpt-4.1, temperature0.7, max tokens1200.
История изменений
Формат основан на Keep a Changelog.
[Unreleased]
Changed
- Документация приведена к коду: README — возможности, требования, сценарии по экранам, дерево, стек, разрешения, ключи; ARCHITECTURE — Auth, S3 LWW, Room v7, фактические вкладки; AI_RULES — автосинк, не «только вручную»
Fixed
- Web: после входа не подтягивались машины с телефона — не было auto-sync и настройки/синк были недоступны без выбранного авто
- Web syncEngine: pull учитывает машины, добавленные из S3 в том же проходе; совместимость bundle
profile(Android) ↔vehicle(web) - Web S3 на HTTP:
crypto.subtleнедоступен → ошибкаdigest; добавлен pure-JS SHA-256/HMAC fallback - Android sync:
No value for idиз-за web-манифеста безid— парсер устойчив, web пишетid/revision - Двусторонняя синхронизация: LWW по
updatedAt; account-config (S3+AI) вusers/{id}/account-config.json - Автосинк 10с, кнопка синка, pull-to-refresh на Android
Changed
- Auth переведён на EuropaServer плагин App Auth (
appId=omnidrive); локальныйauth-server/удалён - Клиенты передают
appIdв register/login; сброс пароля по email временно недоступен (смена в панели/app-auth/)
Fixed
- Web production: белый экран при деплое — сервер должен раздавать
web/dist/, не исходники (/src/main.tsxработает только с Vite dev)
Added
npm run start— production preview на порту 8082web/nginx.conf— пример конфигурации nginx для деплоя- README: Windows PowerShell —
npm.cmdвместоnpm; деплой через локальную сборку и копированиеweb/dist/
[0.2.0] — 2026-07-06
Added
- Web-версия (
web/): React 19 + TypeScript + Vite - Адаптивный UI: нижняя навигация на мобильных, боковое меню на desktop (≥1024px)
- Feature parity с Android: 4 вкладки, FAB, диалоги, шаблоны, регламент, бортжурнал
shared/design-tokens.json— единые цвета и параметры дизайна- Zustand + localStorage для хранения данных в браузере
- Камера и галерея в web через
<input type="file">
Changed
- README и ARCHITECTURE обновлены под монорепозиторий (Android + Web)
[0.3.2] — 2026-07-08
Changed
- Карточка автомобиля: только поле «Название карточки»
- Вкладка «Входящие данные»: фиксированный порядок из 8 полей
- Убраны шаблоны «Номер кузова», «Пробег», произвольные поля
- Диалог добавления: кнопки «Фото» и «Галерея», «Ai анализ» напротив «Изображение»
- Фото машины: множественный выбор из галереи (Android/Web)
- Room v2:
imageUrisJsonдля нескольких фото
[0.5.0] — 2026-07-15
Added
- Auth API (
auth-server/): email/пароль, JWT, сброс пароля - Yandex S3 sync Android + Web (SigV4, manifest, vehicle bundles)
- Настройки: Auth Base URL, S3 bucket/keys, «Проверить S3» / «Синхронизировать»
- Миграция локальных PIN-данных: claim на новый
userIdбез потериvehicleId - Room v6: таблица
sync_state - Документация:
doc/SYNC.md
Changed
- Авторизация: вместо локального логин+PIN — email/JWT (как FlowNote)
- OkHttp в Android для Auth/S3
[0.4.2] — 2026-07-13
Added
- Проверки: меню FAB «Параметры OBD», «Сканировать ошибки», «Проверка по VIN» (каркас)
- Android: интеграция OBD из OBDAssist (
OBD2Service, PID/DTC), Bluetooth ELM327, экраны «Старт» / «Записать» - Записанные проверки дублируются в бортжурнал; долгое нажатие — удаление
- Web: те же экраны в демо-режиме (без реального OBD)
Changed
- Регламент: на карточках списка — информационный блок о следующем ТО (как в деталях)
- Настройки AI: стеклянный стиль в едином оформлении приложения (Android/Web)
- Бортжурнал: карточки ленты — дата слева, пробег справа, теги, сетка вложений 4 в ряд (+N), 2 строки из текстовых блоков
[0.4.1] — 2026-07-11
Changed
- Бортжурнал: лента записей с блоками (текст, фото, видео, AI) по образцу FlowNote
- Теги сверху: ярлык регламента + произвольные теги для поиска
- Редактируемые поля «Дата» и «Пробег» внизу записи; автоподстановка сегодня и max пробега
- Верхняя панель: «Все записи», «Теги», «Архив»; долгое нажатие — меню действий
- Архив (корзина): восстановление или окончательное удаление
- Регламент: текущий пробег из всех записей бортжурнала; цветовая индикация (зелёный / оранжевый / красный)
- При просрочке регламента — срочное уведомление без «осталось N дн.»
- Бортжурнал: иконки навигации без подписей; автоподстановка пробега по дате из истории
- Меню блоков: AI, Текст, Камера, Диктофон, Файлы (как FlowNote)
[0.4.0] — 2026-07-11
Added
- Карточки автомобилей: миниатюра из фото машины, стеклянный стиль, долгое нажатие → удаление
- Проверки: меню FAB «Сканирование OBD» / «Проверка по VIN» (каркас)
- Регламент: пользовательские действия, экран детализации, AI-подбор интервалов, связь с бортжурналом
- Бортжурнал: ярлыки регламентных действий (пробег + дата)
- Данные привязаны к выбранному автомобилю (
vehicleIdв Room / scoped store)
Changed
- Регламент: вместо автогенерации шаблона — отслеживаемые действия с обратным отсчётом до следующего обслуживания
[0.3.5] — 2026-07-10
Changed
- Убраны дублирующие заголовки вкладок («Входящие данные», «Проверки» и др.) — больше места под контент
- Блок фото на вкладке «Входящие» растягивается по высоте экрана (~42%)
[0.3.4] — 2026-07-10
Changed
- Полноэкранный градиентный фон (edge-to-edge): прозрачные системные панели, светлый текст на тёмном градиенте
- Вкладка «Входящие данные»: компактный формат «Марка — Лада» в одну строку, без статуса и даты
- Блок фото машины: увеличенный слайдер на весь блок (swipe / перелистывание), без подписей
[0.3.3] — 2026-07-08
Fixed
- Исправлено падение при запуске камеры: фото теперь сохраняется в
files/imagesчерезFileProvider - Исправлено исчезновение миниатюр после перезапуска: для gallery-URI сохраняются persistable permissions
Changed
- Иконка настроек AI заменена на простую шестеренку
- Добавлен сине-фиолетовый градиентный фон в Android и Web
[0.3.1] — 2026-07-07
Added
- Новая иконка приложения: стилизованное автомобильное колесо
- Верхняя панель на основных экранах Android: кнопки «Все автомобили» и «Настройки AI»
- Экран настроек AI (Bothub.chat): API Key, Base URL, модели, temperature, max tokens
- Интеграция Bothub Vision API для кнопки Ai на Android и Web
- Web: кнопки «Все авто» и «AI» в верхней панели, страница настроек AI
Changed
- Добавлено разрешение
INTERNETдля AI-запросов на Android
[0.3.0] — 2026-07-07
Added
- Начальный flow на обеих платформах:
Авторизация -> Карточки машин -> 4 вкладки - Разделение аккаунтов по логину/PIN в Android и Web
- Экран выбора автомобиля и добавление карточек автомобилей в Android и Web
- Переключение активного автомобиля и выход из аккаунта в web shell
- Android
SessionStore(SharedPreferences) и root-flow (AuthScreen,VehicleSelectionScreen)
Changed
- Web store расширен для scoped-данных по паре
аккаунт + автомобиль
[0.1.0] — 2026-07-06
Added
- Каркас Android-приложения OmniDrive (Kotlin, Jetpack Compose, Material 3)
- 4 вкладки: Входящие данные, Проверки, Регламент, Бортжурнал
- FAB [+] на каждой вкладке для добавления записей
- Диалог добавления данных: шаблоны полей (VIN, фото, пробег…), текст + изображение, кнопка Ai
- Диалог проверок: OBD-сканирование, проверка VIN, произвольная проверка
- Регламент: генератор базового календаря ТО, фильтр по системам, индикация просрочки
- Бортжурнал: автозаписи из других вкладок, ручные записи, сортировка по дате/пробегу
- Room БД: incoming_data, checks, maintenance_tasks, logbook, vehicle_profile
- Hilt DI, репозитории, ViewModels
- Заглушка
ImageRecognitionServiceдля будущего AI-распознавания - Документация: README, ARCHITECTURE, AI_RULES
Technical notes
minSdk 26,targetSdk 35,compileSdk 35- Разрешения: CAMERA, READ_MEDIA_IMAGES, BLUETOOTH_CONNECT (для будущего OBD)
- FileProvider настроен для камеры




