Usage dashboard
Customers can see their active package, remaining data, and daily, weekly, and monthly usage. Expiry dates use the Jalali calendar and Afghan month names.
Utilities
HKB is the customer app for Hindukush Bridge, an internet provider in Afghanistan
HKB is the customer app for Hindukush Bridge, an internet provider in Afghanistan. It gives customers one place to manage their internet connection, check available packages, control connected devices, change Wi-Fi settings, and contact support.

The challenge
Every product has one challenge that affects everything else. This was that challenge.
The biggest challenge was making router controls simple enough for anyone to use, even without technical knowledge. The app connects directly to the customer’s MikroTik router, but MikroTik uses a binary protocol and there was no suitable Dart client, so I had to build one from scratch. On top of that, the app needed live support chat, and package information from several backends, and a simple Persian right-to-left interface with Jalali dates.
Responsibilities
Approach
The app is built around the features customers use most: checking their internet packages, seeing connected users, controlling their speed, blocking unwanted devices, and changing Wi-Fi settings. The main challenge was making these router controls simple and safe for everyday users. The app connects directly to the customer’s MikroTik router, so actions like blocking a device or changing the Wi-Fi settings happen on the router itself. I also added live support, package activation, company contact options, and notifications for new packages and updates
Visual proof
A recording of the production app, and every screen from the released build.
Watch it

A few minutes inside the production app.
Screen 01 / 22
Connected devices with live download and upload speeds per device
Capabilities
What ships in the build today, not what sits on a roadmap.
Customers can see their active package, remaining data, and daily, weekly, and monthly usage. Expiry dates use the Jalali calendar and Afghan month names.
Customers can see all connected devices and their live speeds. They can rename a device, limit its speed, set a time limit, or block it. The router applies these rules directly, so they keep working even when the app is closed.
Customers can change the Wi-Fi name and password or hide the SSID without opening the router admin panel. A PIN can protect these settings, and the app prevents changes that could disconnect the current device.
Customers can send text, multiple images, and voice messages. Images show BlurHash placeholders while loading, and voice messages include a waveform. Messages send immediately, uploads can be cancelled, and failed uploads can be retried.
Customers can browse limited and unlimited packages based on their branch and activate the plan they want. They can also send service requests directly to the provider, including the equipment they need.
Customers with multiple subscriptions can manage them in one app. Switching accounts updates the related data, chat, and notifications together. Important fixes can be delivered through Shorebird or the in-app updater without waiting for a new store release.
Technical decisions
Each of these solutions came with a trade-off. What matters most is understanding why each choice was made. than the choice.
There was no suitable Dart package for the MikroTik binary protocol, so I built the client myself. It handles the protocol, concurrent commands, and streaming responses, and powers the live traffic monitor and device controls without extra dependencies.
Live events such as typing and incoming messages use Socket.IO, while important messages are sent through REST so they are not lost. The socket reconnects differently on Android and iOS when the app goes into the background, and the UI keeps both paths in sync.
Limits and access rules are applied directly on the MikroTik router instead of relying on the phone. This means speed limits, time limits, and other controls keep working even when the app is closed or the phone goes offline.
When a user's token expires while several requests are being sent, the requests wait for one refresh instead of starting multiple refreshes at the same time. If the refresh fails, the app handles re-authentication automatically before asking the user to log in again.
Shorebird is used for Dart-level fixes without waiting for a store release, while the in-app updater handles full app updates. Important updates can also be marked as required, so critical fixes can reach users quickly.
Stack
Outcome
Now live on both stores and serving customers across five branches. Things that once required calling the office, like checking usage, changing the Wi-Fi password, or blocking an unknown device, can now be done directly in the app. Everything is designed to be simple and familiar, with Persian language support and the Jalali calendar.