The queue moved, it didn't disappear
Self-service portals reduced HR email and increased HR Slack. The interaction cost was never removed, only relocated — and the people relocating it are the ones without a desk.
Every US-first HR incumbent ships mobile as a reduced subset of the real thing. Emplora on Android is the same product — same fourteen modules, same Copilot, same permissions — wrapped in a shell that behaves like a native app rather than a web page in a frame.
Research across eight HR platforms found the same pattern: mobile ships as a reduced companion. You can check a balance and approve a request, then you hit a wall and are told to open a laptop. Darwinbox displaced SAP and Workday in Indian conglomerates largely because it did not do this — which is the clearest proof available that mobile parity wins deals.
Two of the three user populations are phone-first. The line manager approves between meetings; the employee has no desktop at all. Both are the users the category serves worst — and 82% of HR-tech rollouts report adoption failure, concentrated exactly there.
So mobile parity became a strategic wedge rather than a delivery detail: identical capability on Android and web, from one codebase, with the phone getting its own layouts instead of a reflowed desktop.
Self-service portals reduced HR email and increased HR Slack. The interaction cost was never removed, only relocated — and the people relocating it are the ones without a desk.
They open an HRIS twice a year, under protest. Any interface that depends on recall between sessions fails them structurally. This is the mechanical cause of the 82% adoption number, not a training budget problem.
Users cannot name what is wrong, but they feel it instantly: a dead back button, a rubber-band overscroll, text that selects when you tap a tab, a bar bar floating over the keyboard. Each one alone is small; together they read as "this is a website".
A 720px data table behind a horizontal scrollbar hides the columns that matter, and nobody discovers the scroll. Responsive is not the same as designed — the phone needed its own layouts, not narrower versions of the desktop ones.
05 — User Stories
06 — Competitor Analysis
Everyone in the category ships an app. Almost nobody ships the product. Read this table as capability on a phone, not "is there an icon on the home screen".
| On a phone, can you… | BambooHR | Rippling | Darwinbox | Emplora |
|---|---|---|---|---|
| Approve leave & view your own record | ✓ | ✓ | ✓ | ✓ |
| Open the full org chart and reach every node | ~ | ~ | ✓ | ✓ |
| Run analytics and see comp-band outliers | — | ~ | ~ | ✓ |
| Read explainable attrition risk per person | — | — | ~ | ✓ |
| Bulk-import a roster from a spreadsheet | — | — | — | ✓ |
| Ask an AI assistant in plain language | — | ~ | ~ | ✓ |
| Get an answer with no network connection | — | — | — | ✓ |
Four decisions shaped the Android build. The first set the ambition; the rest are what that ambition costs once you leave the browser.
env(safe-area-inset-*) to element height rather than padding inside it.
md, tables become card lists, the org chart becomes an
indented tree, short stat tiles go 2-up, and rows with actions stack identity above buttons instead of
sharing a wrapping flex line.Native feel is not one big thing. It is a
finite list of small betrayals, each of which has a fix. All of it is scoped to
html[data-native], which the app shell sets only under Capacitor — so the browser build keeps
normal browser behaviour.
Extracted from Figma via the Figma MCP server and built on Untitled UI primitives — these are the published variables, not approximations of them. The phone inherits the same tokens; only the layout rules change.
Role-adaptive rather than role-gated: one route, three compositions. A promotion changes what Marcus sees without changing where he goes — which matters more on a phone, where there is no sidebar to re-learn.
This is a design and engineering concept running on demo data, so these are build facts rather than adoption numbers — what the Android app can actually do, verified against the same test suite as the web build.
Dashboard, directory, records, org chart, analytics, import, onboarding, training, performance, time off, payroll, offboarding, documents, settings.
Everything the web app can do, the Android build can do — including bulk import and the comp-equity register.
Authorisation is enforced in Postgres, not in app code — so the phone client cannot widen its own scope even if the UI is wrong.
One suite covers both clients, because both clients call the same endpoints with the same permission matrix.
Key Learnings
TypeError: Failed to fetch. The fix was as much diagnostic as technical: the boot screen now shows the compiled-in API address, the app's own origin, and a button that tests the connection. Error messages are interface."I went into the Android build expecting the hard part to be layout, and it wasn't. Shrinking a dashboard is a solved problem. The hard part was everything the browser does for free that an app is not supposed to do — the overscroll, the selection highlight, the tab bar drifting over the keyboard. None of it is in a spec, and users can't name any of it, but they feel all of it within about four seconds. Writing that list down was the most useful thing I did on this project, because it turned an unwinnable vibe into nine tickets. The parity decision was the other one: committing to zero cut features before designing anything meant I never got to negotiate my way out of a difficult screen."
Rupesh Chavan — Product Design & Build