DICHUNG.
On-demand ride-share and delivery across 40+ Vietnamese provinces — airport transfers, shared trips, self-drive rentals, and express cargo, all in one app.
- ORG
- Dichung JSC
- Year
- 2021 — 2022
- Role
- Frontend developer
- Timeline
- 2 years · 5 product lines
- Live
- dichung.vn ↗

The brief
Long-distance trips between Vietnamese provinces ran on empty seats and Facebook posts — drivers ferried passengers one-way, came back empty, and matched riders by hand in scattered group chats.
Inter-province travel in Vietnam is huge — Hanoi to Hai Phong, HCMC to Vung Tau, the airport runs at 4am — but the matching layer was entirely manual. Drivers posted “còn 2 chỗ Hà Nội — Lào Cai” to Zalo groups; passengers replied with phone numbers; payments settled in cash.
Dichung wanted one app where a passenger could search a route, see live capacity from real drivers, and book a shared seat or a private car in under a minute — and where a driver’s empty return leg became a second paid trip instead of fuel burn.
The job: design and ship the customer-facing web app for five product lines — shared rides, airport transfer, express courier, self-drive rental, and tour packages — across 40+ provinces, on a stack a small team could keep deploying weekly.
What changed
How it got built
- 01
Built the route search before anything else.
The product lives or dies on whether a passenger types ‘Hà Nội — Lào Cai’ and gets real seats back fast. Spent the first weeks tuning the autosuggest, the shared/private split, and the time-window picker so the search felt instant on a 3G connection from a tablet in a coffee shop.
- 02
Treated each product line as a config, not a fork.
Shared rides, airport transfer, courier, rental, and tour all share the same booking primitives — pickup, dropoff, time, capacity, price. Modelled them as one form engine driven by config, so adding a new line meant a JSON entry plus a copy file, not a new page tree.
- 03
Made the booking flow survive a flaky network.
Passengers book on the move — buses, taxis, weak hotel WiFi. Built every step (quote, lock seat, pay, confirm) as resumable: refresh mid-payment and the queue picks up with the same lock. Optimistic UI for confirmations, server reconciliation on retry. Zero double-bookings.
- 04
Wired the driver and dispatch tooling to the same spine.
Same React codebase, different routes — one bundle for passengers, one for drivers, one for dispatch. Shared the same auth, same booking state, same SSE stream. Dispatch ops staff could see exactly what a passenger saw, which killed an entire class of ‘I booked it but they say no’ tickets.
- 05
Shipped weekly for two years.
Small team, no staging drama. Built a release rhythm with feature flags, gradual rollouts by province, and on-call rotation tied to booking-volume windows (4am airport spikes, Friday-evening intercity surges). Every release rode a real demand peak, not a calendar.
What it’s built on
Five product lines, 40+ provinces, weekly releases for two years — and an empty return leg turned into a second paid trip.