FixFlow
Modernising a warehouse app
FixFlow is AMIT's warehouse app for car dealers. Mitigate rebuilt it from scratch as a native Android app, and it has been on Google Play since 28 August 2026.
KotlinJetpack ComposeClean ArchitectureRoomKtorKoin

The challenge
The challenge
FixFlow works alongside AutoMaster. Warehouse operators use it on handheld scanners to issue and receive spare parts, run stocktakes and print labels. The app was built in 2021, and after five years keeping it running and adding to it had become steadily harder.
AMIT needed an app that can be developed quickly and that operators can rely on for a whole shift.
Slow and error-prone development
Every change was a risk: three different design patterns overlapped in the app, business logic sat inside screen code, and single source files ran past 1000 lines. Any correction could break an unrelated feature without warning.
No safety net
The app had no automated tests and no static code analysis. As a result, failures were found by staff during the working day rather than by developers before release.
Error messages nobody could act on
When something went wrong, users were shown technical code text they could do nothing about, and some errors stopped the app altogether.
Unreliable in daily use
Loading a large document (around 300 lines) could crash the app, server errors made data disappear or double up, and a session breaking mid-task forced staff to log in again.
The solution
Rebuilt from the ground up
Mitigate rebuilt FixFlow from the ground up as a modern native Android app written in Kotlin with a Jetpack Compose interface. Business logic, data and the user interface are kept strictly apart from the hardware integrations (scanners, printers, signals and system updates), so each part can change without touching the others.
Clean Architecture, enforced
Data, business logic and screens are separate layers for every feature. To keep the architecture honest, 12 custom analysis rules check it automatically on every build.
Changes that are quick and safe
The app is split into 99 separate business scenarios and 19 screen controllers. New features are added next to the existing code rather than woven through it - which makes it quick to ship improvements without risking what already works.
A gradual, safe rollout
The new app was rolled out feature block by feature block while the old version kept running. All settings carried over automatically on first launch, so staff did not have to set up their devices again.
From the first line of code to Google Play - 14 months
Jun 2025
Feature development starts
Aug 2025
First test release (4.0)
Mar 2026
Goods issue rebuilt, automated tests introduced
Jun 2026
Version 5.0 with offline draft support
Aug 2026
Published on Google Play with zero static analysis findings
Workflows
The main workflows
Every workflow was rebuilt around how warehouse staff actually work, using the feedback collected over five years.
Issuing, pre-packing and returns
All three start on the same screen. A document can be found quickly by task or order number, and a return can begin by simply scanning the item. When one item appears on several lines, the line is chosen only once.


Receiving
A delivery number can be found by scanning it. The pause between scans is down to 0.5 seconds, and unsynchronised data is held safely on the device even if the network connection drops.


Barcode scanning
Three distinct sounds and vibration patterns - for confirmation, warning and error - are easy to tell apart without looking up from the shelf. Zebra, Newland and Honeywell scanners all run through one shared integration.



Stocktaking
Quantities for one item can be recorded in up to three locations at once. Counts are held safely on the device until they sync, and a single scan is no longer counted twice.
Spare parts and labels
Spare parts can be searched by text or barcode, and labels print straight to a portable Zebra printer with no extra network setup.
Sign-in and languages
The licence key can be read from a QR code, the branch can be switched inside the app, and the interface is available in four languages: Latvian, English, Lithuanian and Bulgarian.
Technologies
The technologies we used to build FixFlow
The new app is built on a single, current Kotlin stack. The old version used Android tooling from several generations at once.
User interface
Old app
XML layouts and Fragments, mixed with Jetpack Compose
New app
Jetpack Compose throughout the app
Architecture
Old app
Code layers agreed by convention, with nothing enforcing them
New app
Clean Architecture per feature, checked automatically at build time
On-device storage
Old app
SQLDelight; drafts mixed in with the cache database
New app
Room 2.8: a separate cache and a migrated drafts database
Automated tests
Old app
None
New app
764 tests
Static analysis
Old app
None
New app
Automated code checks (detekt) with no findings allowed, using 12 custom architecture and Compose rules
Tooling
Old app
Kotlin 2.2, AGP 8.7, Gradle 8.11, SDK 35
New app
Kotlin 2.4, AGP 9.3, Gradle 9.7, SDK 37
| Area | Old app | New app |
|---|---|---|
| User interface | XML layouts and Fragments, mixed with Jetpack Compose | Jetpack Compose throughout the app |
| Architecture | Code layers agreed by convention, with nothing enforcing them | Clean Architecture per feature, checked automatically at build time |
| On-device storage | SQLDelight; drafts mixed in with the cache database | Room 2.8: a separate cache and a migrated drafts database |
| Automated tests | None | 764 tests |
| Static analysis | None | Automated code checks (detekt) with no findings allowed, using 12 custom architecture and Compose rules |
| Tooling | Kotlin 2.2, AGP 8.7, Gradle 8.11, SDK 35 | Kotlin 2.4, AGP 9.3, Gradle 9.7, SDK 37 |
Scanning uses the manufacturers' broadcast integrations (Zebra DataWedge, Newland, Honeywell), and label printing is supported directly from the device through Zebra PrintConnect.
The result
The result
The new app has been on Google Play since 28 August 2026. The biggest gain is how sustainable and maintainable the system now is - changes and improvements can be shipped quickly and safely without disturbing the working day.
764
automated tests across 83 source files
0
static analysis findings - a release is blocked by the smallest deviation
12
custom architecture rules
~28
Compose UI rules checking the screen code
Since the app went live there has not been a single report of doubled counts, although in the old version staff complained about them regularly.
Fixing a problem now takes days, not months
Turnaround for comparable bugs and improvements in Jira (from the report arriving to the fix):
Old app
Receiving quantity field does not work when corrected by hand
70 daysAutomatic number pad setting in receiving does not work
83 daysApp crashes when loading a large receiving document
51 days
New app
Receiving location disappears after a comment is added
7 daysBlock label printing until the server confirms the data
5 daysKeep unsynchronised data when the network drops
7 days