Enterprise / Logistics

WMS Mobile App

FlutterRiverpodKotlinZPLFastlaneAWS S3Clean Architecture
WMS Mobile App

Overview

About the Project

The WMS (Warehouse Management System) Mobile application empowers warehouse operators to efficiently manage inbound, outbound, packing, shipping, internal and external transfers, cross‑docking, and general scanning from a single Flutter‑based client. Tailored for the Baron client, the app streamlines workflows by enforcing a pallet‑only receipt model and dynamically routing API calls to the correct warehouse instance based on the selected company name at login. Its modular clean‑architecture design separates core services, presentation layers, and environment configuration, enabling rapid adaptation for multiple client types (Inbound, Outbound, Core, Customer).

How it works

Engineering Flow

01

Resolve the warehouse

The operator selects a company name at login, and the dynamic environment configuration injects it into the base API URL so every request is routed to the matching warehouse instance.

02

Capture the scan

Barcode input arrives from the device's native scanner through Platform Channels, giving Zebra, Munbyn, and IPDA terminals a single shared Dart-side entry point.

03

Run the operation

The scan drives the selected warehouse flow - inbound, outbound, packing, shipping, internal and external transfers, cross-docking, or general scanning - with receipts constrained to the pallet-only model.

04

Print the label

ZPL commands are generated with responsive height calculations and media synchronization, then streamed over a TCP socket to the printer IP held in Hive local storage.

Problems solved

Challenges & Resolution

Challenge
Warehouse terminals ship from different vendors (Zebra, Munbyn, IPDA), so scanning support risked a separate native implementation per device family.
Resolution
Moved scanner handling behind Platform Channels, exposing one decoupled Dart interface that each supported device feeds into instead of duplicating native code.
Benefit
A single build works across all warehouse terminals, and adding a device family does not fork the app.
Challenge
Label printing depended on the heavy Zebra SDK, which is Android-only and tied printing to one platform and one vendor toolchain.
Resolution
Replaced the SDK with a high-throughput TCP socket printer that speaks pure ZPL commands directly to the printer.
Benefit
Dropped the Android-only dependency and reduced label-generation latency by 60%.
Challenge
Production APKs reached warehouse staff through manual Google Drive uploads, making every release a hand-run step.
Resolution
Automated the build and release path with Fastlane and Dockerized GitLab pipelines that publish the APK and hand back a direct S3 download link.
Benefit
Releases are reproducible and staff install from a direct link with no manual upload in the loop.

Result

Outcome

Delivered a single Flutter client that covers the full warehouse cycle for the Baron client, from tenant resolution at login through scanning, the pallet-only receipt model, and ZPL label printing. Hardware and printing concerns sit behind Dart-side interfaces rather than vendor SDKs, and the clean-architecture split of core services, presentation, and environment configuration lets the same codebase be adapted for the Inbound, Outbound, Core, and Customer client types.

Highlights

Key Highlights

  • Engineered a decoupled native hardware scanner integration via Platform Channels, supporting Zebra, Munbyn, and IPDA devices, enabling plug‑and‑play barcode scanning across all warehouse terminals without native code duplication.
  • Implemented a high‑throughput TCP socket printer using pure ZPL commands, reducing label‑generation latency by 60 % and eliminating the heavy Android‑only Zebra SDK dependency.
  • Automated CI/CD deployment with Fastlane and Dockerized GitLab pipelines, delivering direct S3 download links for production APKs and removing manual Google Drive steps for warehouse staff.
  • Introduced dynamic environment configuration that injects the selected company name into the base API URL, automatically routing all network requests to the appropriate warehouse instance at login.
  • Optimized ZPL label generation with responsive height calculations and media synchronization, preventing label drift and ensuring reliable multi‑document batch printing on Zebra printers.
  • Persisted printer IP settings using Hive local storage, providing a seamless user experience by auto‑selecting the last used printer on subsequent sessions.
  • Implemented multi‑language support through easy_localization, allowing the app to serve diverse warehouse teams with instant language switching and localized asset bundles.
  • Designed a clean‑architecture folder layout separating core services, presentation, and environment layers, facilitating maintainability and rapid onboarding for new developers.