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

Two phones showing FixFlow: the warehouse task menu and a picking list

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

  1. Jun 2025

    Feature development starts

  2. Aug 2025

    First test release (4.0)

  3. Mar 2026

    Goods issue rebuilt, automated tests introduced

  4. Jun 2026

    Version 5.0 with offline draft support

  5. 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.

A FixFlow goods issue document with spare part lines and a number padThe FixFlow menu with picking, pre-packing and returns

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.

A FixFlow receiving document with item codes and quantitiesA FixFlow notice about items that are not yet synchronised

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.

A handheld scanner showing the FixFlow barcode scanning screenA FixFlow notice confirming that picking is completeA FixFlow warning about a mismatch between counted and invoiced quantities
  • 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

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 days
  • Automatic number pad setting in receiving does not work

    83 days
  • App crashes when loading a large receiving document

    51 days

New app

  • Receiving location disappears after a comment is added

    7 days
  • Block label printing until the server confirms the data

    5 days
  • Keep unsynchronised data when the network drops

    7 days