Anudeep
All work
Logistics · Mobile2026·Product Designer

Five apps with the same icon, rebuilt as one

WarePro's handheld app was a launcher full of near-identical apps. I rebuilt the operator side as one system; at a customer site now running it on PiGo, inventory accuracy rose from 70% to 95%.

RelatedPiGo: the app this design grew into

FigmaAtlassian Design SystemMobile UXDesign Systems
Live demo
Role
Product designer — research, flows, component library, UI across all modules
Timeline
2026
Team
With PIPRA's WarePro product and engineering teams
Platform
Android handhelds · warehouse scanners
Status
Delivered; now running in PiGo at customer sites

The problem

The app opened on a “Select your app” launcher where five assembly apps shared one identical icon. Inside, screens showed raw unlabelled IDs to operators working one-handed with a scanner, where a mis-read becomes a real inventory error.

The outcome

Nine flows rebuilt as one system on the Atlassian Design System — task-first instructions, a single status grammar, and guards that stop invalid work before it's submitted. At a customer site running WarePro on PiGo, the app this redesign grew into, inventory accuracy rose from 70% to 95% (reported by PIPRA).

If you read nothing else

01

The original wasn't one app — it was a launcher of separate apps, several of which were visually indistinguishable from each other.

02

The unit of design here is a task, not a screen: every flow states the next physical action before it shows any data.

03

A mis-scan isn't a UI bug, it's stock that exists in the system but not on the shelf — so consistency is a safety feature, not a style preference.

Open the old WarePro app and the first thing you get isn't work — it's a menu. “Select your app.” Five tiles for assembly alone: Pick, Assembled, QC, Box Packing, Carton Packing. Every one of them the same orange box with the same green tick.

The original launcher. Five different jobs, one identical icon — the label is the only thing distinguishing them, so the icon does no work at all.
The original launcher. Five different jobs, one identical icon — the label is the only thing distinguishing them, so the icon does no work at all.

What was actually wrong

It had grown into a folder of apps, not a product

Each warehouse job had been shipped as its own mini-app, and the launcher was how they were held together. Different roles saw different grids, so there wasn't even one consistent home screen to learn — and because every tile reused the same generic icon, choosing the right one meant reading every label, every time.

Inside, the screens had the same problem in miniature. A manufacturing list showed “80078 · 1000134 · 1000001” with nothing labelling which number was the order, the part, or the location. Titles truncated mid-word. Detail screens were bare label-and-value tables with no hierarchy, so the ordered quantity looked exactly as important as the internal location code. Filters lived in a tab bar pinned to the bottom of the screen, far from the list they controlled.

The reframe

Design the task, not the screen

The desktop instinct is to present data and let the user decide what to do with it. On a warehouse floor that's backwards — the operator already knows which job they're on; what they need is the next physical action. So every flow now leads with the instruction and puts the data underneath: “Task 3 of 4,” then “1. GO TO THIS BIN — A1-02,” then the item. The screen tells you where to walk before it tells you what you're carrying.

Putaway, redesigned — progress state, then the bin at the largest type on screen, then the item, then the single scan action.
Putaway, redesigned — progress state, then the bin at the largest type on screen, then the item, then the single scan action.

Process

Understanding, then components, then screens

I worked it in that order in Figma — an Understanding page mapping how each job actually runs, then a component and variables library (cards, tabs, buttons, status bar, the WarePro colour ramp), and only then the screens. Building the pieces first is what let nine modules end up speaking the same language instead of nine separate visual dialects.

The receiving and manufacturing list screens each went through a dozen-plus iterations before they settled. I annotated the reasoning directly on the canvas as I went, so the decisions were arguable with the product team rather than just asserted.

“Segmented tabs on top give easy navigation — most users have used that kind of interaction before, so it won't confuse them while using it.”

From my design annotations in the Figma file

Design principles

Three rules for a device held in one hand

Emphasise what matters first

Every card leads with the information the operator actually scans for — the order, the quantity, the status — and demotes internal codes. Readability by hierarchy, not by making everything bigger.

Use patterns they already know

Segmented tabs on top, search where search always is, a familiar card list. Novelty costs nothing to design and a great deal to learn on a shift.

Say the next action

Instructions are numbered steps — “1. Scan Location Barcode.” The operator should never infer what the app expects from them next.

The system

Why Atlassian, again

I'd already put PI-ERP on the Atlassian Design System for its density under enterprise data, and the reasoning applies harder here. Warehouse screens are lists of states — orders, batches, shipments, bins — and Atlassian's lozenge and card patterns are built for exactly that, without the generous consumer spacing that would cost visible rows on a small screen. Sharing it across both products also means a PIPRA operator moving between desktop and handheld isn't learning two visual languages.

Receiving — purchase orders with completion percentages and unit counts, not bare IDs.
Receiving — purchase orders with completion percentages and unit counts, not bare IDs.
Inventory — filter tabs moved to the top, for the two states anyone actually searches for.
Inventory — filter tabs moved to the top, for the two states anyone actually searches for.
Quality check — a scan queue with pass/fail per batch, and a submit that stays disabled until an inspection exists.
Quality check — a scan queue with pass/fail per batch, and a submit that stays disabled until an inspection exists.
Dispatch — shipments sorted by readiness, with the authorise action only on the one that's ready.
Dispatch — shipments sorted by readiness, with the authorise action only on the one that's ready.

Key decisions

The calls that protect the count

Collapse the launcher into flows

WhyFive near-identical tiles is a choice the operator shouldn't have to make. Reorganising around the actual chain of work — receive, put away, check, pack, dispatch — means the app reflects the shift rather than the org chart of how it was built.

Label every number, kill the bare IDs

Why“80078 · 1000134 · 1000001” is only readable to someone who already memorised the schema. Every value now carries its field, because the person reading it is holding a box and hasn't got working memory to spare.

Move filters from the bottom bar to segmented tabs on top

WhyFilters belong next to what they filter. Putting them directly above the list — a pattern operators have met in every other app they use — removes the gap between choosing a state and seeing it applied.

Disable submit until the work is real

WhySubmit QC Report, Execute Transfer and Process Return all start disabled and enable only once items are genuinely scanned in. Preventing an empty submission is far cheaper than reconciling a phantom one against physical stock later.

Offer the alternative at the point of failure

Why“Bin is full? Suggest alternative” sits right on the putaway screen. The moment someone hits a physical blocker is exactly when they improvise and put stock somewhere the system doesn't know about — so the recovery path has to be in reach before that happens.

A persistent scan trigger in a fixed position

WhyScanning is the most repeated action across all nine modules, so it gets the same floating control in the same place everywhere. Positional consistency matters more than elegance when someone performs an action hundreds of times a shift.

Receiving — purchase order to pre-receive checklist to scan.
Quality check — building an inspection queue, then passing or failing each batch.
Dispatch — the end of the chain: authorise a ready shipment and release it.

Scope

9 flows
receiving, putaway, inventory, QC, packing, dispatch, transfer, returns, sales orders
1 system
one component library replacing a folder of separate apps
One-handed
designed around thumb reach and a scanner in the other hand
Delivered
full mobile redesign handed to the product team

Result

70% → 95%
inventory accuracy at a customer site running WarePro on PiGo, the app this redesign grew into (reported by PIPRA)
PIPRA's published result, with the CEO and VP at the customer's warehouse; customer staff and branding are covered. The gain belongs to the whole product and team. The design's part was making every scan say what to do next, so wrong stock is stopped at the shelf.
PIPRA's published result, with the CEO and VP at the customer's warehouse; customer staff and branding are covered. The gain belongs to the whole product and team. The design's part was making every scan say what to do next, so wrong stock is stopped at the shelf.

What I took from it

Consistency is a safety feature here

On a marketing site, an inconsistent component is an aesthetic problem. In a warehouse app it's a mis-scan — and a mis-scan is stock that exists in the system but not on the shelf. Giving nine modules one status grammar, one scan position and one instruction format wasn't tidiness. It was the cheapest available way to reduce the number of decisions someone has to make while holding a heavy box.