Перейти к содержимому
Антон ГончаровРазработчик ИИ-систем

Веб-приложение · PWA · нативный JS

Офлайн-приложение курьера

Курьер, выездной мастер или торговый представитель часто работают там, где связь пропадает: в подвале, лифте, за городом. Обычное веб-приложение в этот момент перестаёт открываться, а отметки «доставлено» теряются. Здесь всё сохраняется на телефоне и отправляется само, как только появится сеть, — с повторами, без дублей и без потери фото.

Сценарий: Курьер обжарочной «Зерно» — вымышленной — развозит пять заказов: кофейни, офис и частные клиенты.

Скриншот демо: Офлайн-приложение курьера

Открыть демо

Удобнее с телефона: приложение можно установить на главный экран. Сеть выключается переключателем вверху или по-настоящему — режимом полёта.

Приложение работает в браузере: на сервер ничего не отправляется.

Что показывает демо

  • Открывается без сети: приложение целиком хранится на устройстве, новая версия ставится по кнопке «Обновить»

  • Заказы, звонок клиенту в одно касание, статусы «в пути», «доставлен», «не дозвонился»

  • Вручение: фото сжимается на телефоне в WebP — из 2 МБ получается около 130 КБ — подпись клиента пальцем, комментарий

  • Очередь изменений: отправка по порядку, повторы с растущей паузой на плохой связи, фоновая синхронизация

  • Переключатель «сеть: есть / плохая / нет» — видно, как приложение ведёт себя при обрывах

  • Вкладка «Диспетчер»: заказы глазами офиса, фото и подписи, лента событий; в соседней вкладке обновляется сама

  • Конфликты: если адрес изменили и курьер без сети, и диспетчер, — карточка с выбором версии вместо тихой перезаписи

Как попробовать

  1. Выключите сеть

    Переключателем «Сеть: нет» или режимом полёта. Перезагрузите страницу — приложение откроется.

  2. Вручите заказ

    «Доставлен» → «Тестовое фото» или камера, подпись пальцем, комментарий. Заказ помечен «не отправлено».

  3. Верните сеть

    Очередь уйдёт в диспетчерскую — журнал покажет, что и когда отправлено. На «плохой» связи видны повторы.

  4. Разыграйте конфликт

    Кнопка «Разыграть конфликт»: вы без сети уточняете адрес, а диспетчер его меняет. Выберите верную версию.

Без платных нейросетей

Диспетчерская здесь — имитация в браузере: своя база и задержки сети, как у настоящего сервера. Заказы, фото и подписи хранятся на вашем устройстве и никуда не отправляются. В рабочем проекте очередь уходит на сервер с API, диспетчер видит заказы в своей панели, а клиенту приходит уведомление о доставке.

Демо работает без API-ключей OpenAI, YandexGPT или GigaChat. Там, где рабочая система обращается к модели, стоит локальная заглушка с тем же интерфейсом — поэтому демо бесплатно, всегда доступно и ничего не выдумывает.

Что будет в рабочем проекте

  • Сервер с API заказов и панель диспетчера с картой и статусами курьеров
  • Маршрут и геопозиция, уведомления клиенту в Telegram, Max или SMS
  • Вход курьера, роли и журнал действий для разбора спорных доставок
  • Связка с 1С, МойСклад или CRM: заказы приходят оттуда, статусы и фото возвращаются

Стек

  • JavaScript без фреймворков
  • Service Worker
  • IndexedDB
  • Background Sync
  • Canvas
  • Pointer Events
  • BroadcastChannel
  • Web Locks
  • Vite

Основано на

Книги и дисциплины, идеи из которых работают в этом демо.

  • Книга · Джон Литтл

    Внутренний воин

    Обрыв связи — не повод остановиться: приложение работает без сети и отправляет изменения, когда связь вернётся.

  • Книга · Харви Дейтел, Пол Дейтел, Дэвид Чофнес

    Операционные системы. Основы и принципы

    Если курьер без сети и диспетчер изменили один и тот же заказ, конфликт не решается молча «кто последний записал» — курьер выбирает, чья версия верная.

  • Книга · Эндрю Таненбаум, Херберт Бос

    Современные операционные системы

    Service Worker хранит приложение на устройстве, а очередь изменений отправляется по порядку с растущей паузой на плохой связи.

Комментарий от разработчика

Антон Гончаров

Разработчик ИИ-систем · Python

Для бизнеса

  • Отметки «доставлено» и фото не теряются в подвале или за городом — уйдут, когда появится сеть.
  • Спорные доставки разбираются по фото и подписи, а не по словам курьера.
  • Если адрес поменяли и курьер, и офис, правка не перезаписывается молча — курьер выбирает верную версию.

Для разработчиков

  • Service Worker написан вручную и кеширует сборку целиком; список файлов и версию подставляет плагин Vite.
  • Заказы и очередь изменений — в IndexedDB. Отправка по порядку с растущей паузой, Background Sync и Web Locks против двойной отправки.
  • Фото сжимается на Canvas в WebP, подпись рисуется через Pointer Events, вкладки синхронизируются через BroadcastChannel.

Советы

  • Совет 01

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

  • Совет 02

    Давайте каждому изменению свой идентификатор: повтор после обрыва не должен создавать дубль.

Нужен такой же для вашего бизнеса?

Расскажите о задаче — отвечу, что из демо подойдёт вам, сколько это займёт и что понадобится с вашей стороны.

Другие демо в этом разделе

Все демо
  • Веб-приложение · OCR · проверка реквизитов

    работает

    Распознавание документов

    Загрузите счёт или акт — фото, скан или PDF. Приложение распознаёт текст, вытаскивает реквизиты и строки таблицы и проверяет их: контрольные суммы ИНН и счетов, итог и НДС.

    • React
    • TypeScript
    • Нейросеть в браузере
  • Веб-приложение · диалоги · сделки · аналитика

    работает

    Панель оператора

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

    • React
    • TypeScript
  • Веб-приложение · Recharts · RBAC · аудит

    работает

    SaaS-дашборд

    Кабинет команды выручки SaaS: MRR по тарифам, движение выручки, отток, здоровье клиентов, выгрузка CSV для Excel и журнал действий. Все цифры считаются из одной истории за год — смена тарифа в карточке клиента сразу двигает MRR на графиках.

    • React
    • TypeScript
  • Веб-приложение · Laravel · PostgreSQL

    работает

    Складской контур на Laravel

    Учёт склада, где остаток — сумма проводок, а не «поле qty--»: заказы с резервом «всё или ничего», сборка по ячейкам, приёмка с импортом CSV, инвентаризация и журнал. Гонка двух настоящих процессов PHP в PostgreSQL показывает, зачем нужна блокировка строки.

    • PHP
  • Веб-приложение · метрики · оповещения

    работает

    Мониторинг бота

    Как следят за ботом, когда он уже работает с клиентами: сколько запросов, как быстро он отвечает, как часто ошибается или не знает ответа. Журнал запросов с трассой каждого ответа и правила, которые пишут дежурному в Telegram, если что-то пошло не так.

    • React
    • TypeScript
  • Парсер на Python · работает в браузере

    работает

    Мониторинг цен конкурентов

    Парсер на Python каждый день обходит сайты трёх конкурентов магазина электроники: HTML-каталог с пагинацией, sitemap с JSON-LD и SPA с API. Сопоставляет товары с каталогом, присылает уведомления об изменениях, рекомендует цену по правилам и выгружает отчёт в Excel. Python работает прямо в браузере.

    • Python
    • React
    • TypeScript