The common framing is "low-end devices", and it is mostly wrong. A four-year-old Android phone has enough processing power for almost any business application. What it does not have is a reliable, unmetered connection — and the cost of that data is a real household decision, not a technical footnote.
Payload size is a price, not a metric
When a user is on a metered connection, every megabyte your application ships has a cost they can name. A 3MB JavaScript bundle is not a Lighthouse score; it is money. This reframes performance work from optimisation to product ethics, and it changes what you are willing to trade.
- Render the critical path on the server. The first meaningful view should not require a bundle to download, parse and hydrate before it exists.
- Ship images responsively and in modern formats, and treat an unoptimised hero image as a defect rather than a nice-to-have.
- Defer everything non-essential, and be honest about how much of your analytics and tag payload is essential.
- Cache aggressively at the edge. Content that changes daily should not be re-fetched on every navigation.
Design the failure, not just the success
On an unreliable connection, requests fail routinely. A product that treats failure as exceptional will feel broken several times a session. The behaviour you design for a dropped request matters more than the behaviour you design for a successful one.
- Never lose user input to a failed request. Persist locally first, synchronise afterwards.
- Make retries explicit and manual where the action costs money, automatic where it does not.
- Show real state: "saved", "saving", "not saved — retry" beats an ambiguous spinner that resolves into nothing.
- Make destructive actions idempotent, because a user who is unsure whether a request succeeded will repeat it.
None of this is charity engineering. The same decisions — server-rendered critical paths, small payloads, honest failure states, idempotent actions — make the product better on a fibre connection in London. The constrained market simply makes the cost of ignoring them visible.
