Anudeep
All work

PI-ERP · Role-based UX at scale / Product design case study

An ERP that tells each person what needs them.

PI-ERP has 774 screens, seven maintenance roles, warehouse roles and several tenants. I designed and implemented the UX layer that lands each role on its own work, shows how urgent it is and what to do next, and holds every screen to one design system: on the web, in PiGo and in the Kuyil assistant.

Role
Product design · UX engineering (theme, configuration, renderer)
Team & time
Only designer, with engineering · about a month (Oct 2026)
Scope
774 web screens · PiGo · Kuyil
Status
Live · web, PiGo and Kuyil

RelatedThe 2025 PI-ERP visual restyle PiGo mobile platform Kuyil AI assistant, the full redesign

Final capture. A PI-ERP technician dashboard showing the technician's own maintenance widgets, beside a PiGo phone home with an attention banner and KPIs; tenant names masked.

A PI-ERP technician dashboard showing the technician's own maintenance widgets, beside a PiGo phone home with an attention banner and KPIs; tenant names masked.

Scroll horizontally on small screens to inspect details. Press Escape to close.

A technician's dashboard on the web, and the same design system on PiGo. Tenant names masked.
The problem
Every role landed on the same crowded Home, urgency was invisible, and the web app failed keyboard and tablet use.
What I did
Designed and implemented the UX layer: role landing, one severity language, a 774-screen accessibility and responsive sweep, and one brand setting across products.
The result
Seven roles land on their own work, automated accessibility violations fell from 286 to 15, and tenant branding went from seven setup steps to upload and save.

01 / Starting point

The first screen showed everything except the person's work.

Each maintenance role landed on about 30 widgets from every module (warehouse, edge devices, marketplace, chat), most of them empty for that tenant. A planner's own work started about 1,250px down the page, and some roles couldn't log in at all. Now each role lands on its own work, set up through configuration alone, with no change to the ERP core.

Before capture. Planner Home before: the first screen is filled with large empty My Work cards; none of the planner's maintenance work is visible.

Planner Home before: the first screen is filled with large empty My Work cards; none of the planner's maintenance work is visible.

Scroll horizontally on small screens to inspect details. Press Escape to close.

Before: a planner's first screen, with none of their own work.

After capture. Planner Home after: empty cards shrunk to one line, then upcoming preventive maintenance with due dates and overdue maintenance with Preventive, Inspection and Emergency lozenges.

Planner Home after: empty cards shrunk to one line, then upcoming preventive maintenance with due dates and overdue maintenance with Preventive, Inspection and Emergency lozenges.

Scroll horizontally on small screens to inspect details. Press Escape to close.

After: the planner's own work and its urgency come first.

02 / The principle

Every screen answers: what's affected, how bad, what next.

The tickets asked for severity, blocked stock and the next decision to be obvious. I turned that into one checklist every screen was held to: clear meaning, severity at a glance, a next action, urgent work first, calm empty states, one design system, and safe for every tenant's brand.

The question I started with
Is the information somewhere on the screen?
The question it became
Can this person tell what needs them, in a few seconds?

Warehouse excursion header: HIGH_TEMP with Critical and Held in quarantine lozenges, an amber Breach in progress banner, Blocked Qty 47 and Blocked Items 3 in red, and a stepper from Open to Decided.

Warehouse excursion header: HIGH_TEMP with Critical and Held in quarantine lozenges, an amber Breach in progress banner, Blocked Qty 47 and Blocked Items 3 in red, and a stepper from Open to Decided.

Scroll horizontally on small screens to inspect details. Press Escape to close.

The principle on one screen: how bad (Critical), what's stuck (47 units, 3 items) and what happens next (the decision opens once the breach clears).

03 / The right work, at the right urgency

Show urgency, and only where a decision is made.

Verified role by role on a demo tenant, on the web and on PiGo.

  1. 01Land each role on its own work

    Evidence
    Seven maintenance roles existed but couldn't log in to a tenant, and every role saw the same Home.
    Decision
    Map each role to the widgets for its work, and hide other modules for those roles only. Warehouse roles follow WarePro's own app checkboxes, so no new roles were needed.
    Trade-off
    The left menu still lists every module; a role-specific menu is a follow-up.
    Implemented result
    Seven maintenance roles, the warehouse roles and Admin verified, with eight new warehouse widgets from receiving to dispatch. Configuration only, reusable per tenant.
  2. 02Urgency on the first screen

    After capture. Supervisor dashboard: Jobs Awaiting Approval with amber days-waiting counts from 20 to 22, and Escalated Alerts with red Alert and amber Approval lozenges and raised dates.

    Supervisor dashboard: Jobs Awaiting Approval with amber days-waiting counts from 20 to 22, and Escalated Alerts with red Alert and amber Approval lozenges and raised dates.

    Scroll horizontally on small screens to inspect details. Press Escape to close.

    Supervisor: how long each job has waited, and which escalations are alerts.
    Evidence
    Counts were bare, statuses were codes like IP and MW, dates were missing, and a five-row limit could cut an Emergency job off its card.
    Decision
    One severity language (Emergency solid red, Critical red, waiting or overdue amber), plus due and raised dates, status names, Emergency first, and empty widgets shrunk to one line.
    Trade-off
    At most one lozenge column per list, so some states stay plain text.
    Implemented result
    All seven roles reviewed on 14 screens, web and PiGo: 49 improvements, with no feature, label or button removed.
  3. 03Color only where a decision is made

    Rejected capture. Rejected iteration: an excursion list with colored Severity, Status and Hold Status cells, with red review marks drawn over it.

    Rejected iteration: an excursion list with colored Severity, Status and Hold Status cells, with red review marks drawn over it.

    Scroll horizontally on small screens to inspect details. Press Escape to close.

    Rejected: three colored columns (the red marks are review notes).

    Final capture. Final excursion list: only the Severity column carries lozenges (Critical, Emergency, Warning); the other columns are plain text.

    Final excursion list: only the Severity column carries lozenges (Critical, Emergency, Warning); the other columns are plain text.

    Scroll horizontally on small screens to inspect details. Press Escape to close.

    Final: Severity is the only colored column.
    Evidence
    The first version colored the Severity, Status and Hold Status cells of a list. Across many rows it read as noise.
    Decision
    Keep lists plain: only Severity is a lozenge. Color lives on the record header and the board cards, and each color has one meaning (Danger, Warning, Info, Success), written into the UI standard for other teams.
    Trade-off
    The list is quieter than the first version, so lower-severity states stand out less.
    Implemented result
    Lozenge and banner text at 5.2:1 to 7.1:1 contrast (the gate is 4.5:1), from design tokens only.

04 / Quality across every screen

Measured on all 774 screens, not a sample.

Every screen reachable from the menu was opened and checked for accessibility and at seven browser widths, and each of the 22 web roles was checked with its own login.

Automated WCAG violations on eight key screens
286 → 15
Tab stops with a visible focus ring
0 → 165 / 165
Text below 4.5:1 contrast, across 643 screens
188 → 27
Keyboard traps across 774 screens
0
Screens clean at 1280+, 1024 and 768px, before the responsive fixes
97 · 42 · 0%
Desktop pixel change from the responsive fixes
0.00–0.02%

Checked with axe-core and keyboard walks against WCAG 2.1 AA. The issues left are core iDempiere markup and other teams' plugins.

  1. 01Keyboard first, mouse unchanged

    Before capture. Menu before: after pressing Down from the menu search, focus stays in the search box.

    Menu before: after pressing Down from the menu search, focus stays in the search box.

    Press Escape to close.

    Before: Down does nothing.

    After capture. Menu after: the Partner Relations row shows a blue focus ring after pressing Down.

    Menu after: the Partner Relations row shows a blue focus ring after pressing Down.

    Press Escape to close.

    After: arrow keys move a visible focus.
    Evidence
    The left menu tree couldn't take focus, so no window could be opened without a mouse, and none of 152 non-text tab stops showed a focus ring.
    Decision
    Turn the menu into a keyboard tree with one tab stop, and show the design system's focus ring on keyboard focus only.
    Trade-off
    Desktop toolbar icons under 24px were reported, not resized, because the desktop layout stays as it is.
    Implemented result
    Arrow keys and Enter open any window from the menu, Escape closes popups and returns focus, and toolbar buttons respond to Enter and Space.
  2. 02Fix tablet and phone without touching desktop

    Before capture. Technician dashboard at phone width before: the desktop layout squeezed into a narrow column with wrapped, truncated table cells.

    Technician dashboard at phone width before: the desktop layout squeezed into a narrow column with wrapped, truncated table cells.

    Press Escape to close.

    Before, at 390px.

    Fixed capture. Technician dashboard at phone width with the fix: a readable Technician Dashboard heading and a jobs table with priority lozenges.

    Technician dashboard at phone width with the fix: a readable Technician Dashboard heading and a jobs table with priority lozenges.

    Press Escape to close.

    With the fix, at 390px.
    Evidence
    97% of screens were clean at 1280px and wider, 42% at 1024px, and none at 768px. Six shared layout problems caused most of it.
    Decision
    Fix the six shared problems once, following the design system's web-app behavior, and apply the fixes only below 1024px.
    Trade-off
    Problems that only appear on desktop are logged, not changed.
    Implemented result
    With the fixes, desktop and laptop screens stay pixel-identical (0.00–0.02% difference) while tablet and phone layouts reflow.

05 / One design system, every product

One brand, one color language, everywhere.

The web app, PiGo and Kuyil now read the same design tokens and the same tenant brand.

  1. 01Keep the priority color, and make it readable

    Before capture. Calendar popup before: an amber Open Record button with white text, and status shown as DR.

    Calendar popup before: an amber Open Record button with white text, and status shown as DR.

    Scroll horizontally on small screens to inspect details. Press Escape to close.

    Before: white on amber (3.2:1), status DR.

    After capture. Calendar popup after: an amber Open Record button with dark text, and status shown as Drafted.

    Calendar popup after: an amber Open Record button with dark text, and status shown as Drafted.

    Scroll horizontally on small screens to inspect details. Press Escape to close.

    After: dark on amber (9.2:1), status Drafted.
    Evidence
    The restyle replaced the calendar popup's amber button with the standard blue. In review, the CEO asked to keep the priority color, and to show status names instead of codes like DR.
    Decision
    I recommended a standard button with the priority shown in a band and a lozenge. The CEO chose the priority-colored button, so I kept it and picked the text color per priority until every pair passed contrast.
    Trade-off
    A red button can read as “delete”, which the standard button avoided.
    Implemented result
    All eight priority colors pass 4.5:1: amber went from 3.2:1 to 9.2:1, and status reads “Drafted” instead of “DR”.
  2. 02One brand setting for every product

    Evidence
    Tenant colors disappeared after Change Role, PiGo kept a one-time copy of the primary color, Kuyil used a fixed blue, and a logo needed four hand-made configuration records.
    Decision
    One Appearance & Branding record drives the web app, the role screen, PiGo and Kuyil, and colors that would fail contrast are darkened automatically (text 4.5:1, borders 3:1).
    Trade-off
    Before sign-in the tenant is unknown, so the first login page keeps the PI-ERP brand.
    Implemented result
    Upload a logo and save, and it's live everywhere. 36 checks passed and none failed, across four tenants.

06 / Kuyil, the AI assistant

Answers you can check.

Kuyil answers questions about PI-ERP data. Its answers gave no source, and a failure only said “I'm sorry, I encountered an error”. The redesign moves Kuyil onto the same tokens and icons as PiGo and the web app. Every answer names its source and time, records open in PI-ERP, and data sits in a card with table and chart views, copy and CSV. A failed answer says what happened, with Try again and Edit question. The full redesign has its own case study.

Before capture. Kuyil before: a chat answer with a plain table, raw dates and status codes, a Clear button with a trash icon and an always-green status dot.

Kuyil before: a chat answer with a plain table, raw dates and status codes, a Clear button with a trash icon and an always-green status dot.

Scroll horizontally on small screens to inspect details. Press Escape to close.

Before. Drawn from the running build.

After capture. Kuyil after: the answer with a Results card (Table and Chart toggle, copy, download), record links that open in PI-ERP, Copy, Read aloud and Translate actions, and a follow-up chip.

Kuyil after: the answer with a Results card (Table and Chart toggle, copy, download), record links that open in PI-ERP, Copy, Read aloud and Translate actions, and a follow-up chip.

Scroll horizontally on small screens to inspect details. Press Escape to close.

After. Drawn from the running build.

07 / How I worked

A review page for every ticket.

I was the only designer, working with engineering over about a month of sprints. Each ticket ended in a review page with live before-and-after captures, the checklist, findings with an owner for each, and the decisions still needed. Problems outside my scope went to their owners instead of being patched around.

Every change was configuration or a shared component, never a one-off: migrations ran twice against a real database before deploy, and checks confirmed no hard-coded record IDs and no raw color values.

08 / Collaboration

I designed and implemented the UX layer. Module teams owned the logic underneath.

My contribution

  • UX direction and the screen checklist
  • Design tokens and the color rules
  • Theme, screen configuration and renderer changes
  • Accessibility and responsive audits of 774 screens
  • PiGo and Kuyil front-end updates
  • AI-assisted coding and automated checks

Product / leadership

  • CEO and product review
  • Ticket goals and acceptance criteria
  • Rollout approval per tenant

Engineering & module owners

  • iDempiere core
  • Maintenance, warehouse and edge-device logic and data
  • Kuyil's chat server
  • Deployment and infrastructure

09 / Status

All five areas are live.

Role landing & dashboards
Live
Tenant branding
Live
Board views & calendar
Live
Accessibility & responsive
Live
Kuyil redesign
Live

Status as of late October 2026.

10 / Learning

A product with 774 screens doesn't improve one screen at a time. It improves when every screen keeps the same few promises: show me my work, tell me how bad it is, give me the next step, and work for every keyboard, screen size and brand.

What I'd do differently

Write the shared rules first. The severity colors and the screen checklist came after the first role dashboards were set up, so those dashboards had to be reviewed a second time.

Still open · not implemented

A view of which orders an asset breakdown delays; role-specific menus; the first login page in the tenant's brand; Kuyil feedback, regenerate and inline citations, which need server work.