Tayyn Hyzmat
OngoingDelivery dispatch for a Turkmenistan operator: a web dashboard for dispatchers and an Android app for drivers, built for slow connections.
- Vue 3
- TypeScript
- shadcn-vue
- Capacitor
- Express
- Prisma
- PostgreSQL
- Socket.IO
- Docker





Synthetic data from the pre-release pilot build.
Outcome
Internal pilot: phoned-in orders reach drivers in seconds, and each claim is checked on the server so no order is taken twice.
Context
Tayyn Hyzmat handles restaurant, flower and parcel deliveries in Aşgabat. Customers phone in orders. A dispatcher enters each one, and drivers in that region get a 20-second offer to claim it. The driver app is handed out to drivers directly rather than through Google Play.
Decisions
- Kept Vue. The project started from the open-source OpenRide base. The client wanted something light and simple to run, so I upgraded it to Vue 3 with strict TypeScript and rebuilt the dispatcher and driver apps instead of rewriting in another framework.
- Kept the familiar grid. Many drivers are older and already knew a region-grid layout from the app they used before. The new driver home keeps that grid, with live order and driver counts per region.
- Built for weak signal. Socket.IO pushes order and count updates, lists refresh on reconnect, and the server rechecks every claim so two drivers can never take the same order.
- Shifts survive a locked phone. The Android app keeps a driver on shift in the background with a renewable 60-second lease, and drops them when GPS goes stale.
Stack
Vue 3, Vite, TypeScript and shadcn-vue for the browser apps, Capacitor for Android, and an Express API with Prisma, PostgreSQL and Socket.IO. Everything ships as Docker images.
Status
Internal pilot with one dispatcher and a small group of drivers.