Frontend
Progressive Web Apps
One codebase that installs to the home screen, works offline, and is found by a link — built by engineers honest about where a PWA beats native and where it does not.
Overview
A Progressive Web App is an ordinary website that uses modern browser capabilities to behave like an installed application. It is built with the same HTML, CSS and JavaScript as any web page, then given three things a normal site lacks: a web app manifest that lets it install to the home screen with its own icon and no browser chrome, a service worker that intercepts network requests so it can work offline or on a flaky connection, and, where the platform allows, push notifications and background sync. The result loads in a browser, is delivered by a URL, and yet opens, works and feels much like the app you would otherwise download from a store.
The reason to build one is almost always reach and cost. A PWA is a single codebase that runs on Android, on desktop, and on iOS, is indexed by search engines, is shared by a link, and updates the instant you deploy — no app-store review, no download, no per-platform build, no thirty-percent store cut. Set against the alternative of building and maintaining separate native apps, that is a large saving in money and in time-to-change. The honest counterweight is that a PWA trades away some depth: it cannot reach every device capability, iOS has historically constrained what web apps may do, and for a graphics-heavy or deeply device-integrated product native still wins.
We build PWAs when the job is to put a capable, offline-tolerant experience in front of the widest possible audience without the cost and gatekeeping of native — content and utility apps, internal tools, storefronts, field applications used on patchy networks. We start every one of these engagements by testing whether a PWA is genuinely the right shape for what you are building, because the technology is quietly powerful for the right problem and a poor fit for the wrong one, and we would rather say so before you spend the budget.
Best for — Content and utility products that need the widest reach and offline tolerance at the lowest cost — where one installable, URL-discoverable web app beats building and maintaining separate native apps.
Why teams choose Progressive Web Apps
One codebase, every platform
A single web app installs and runs on Android, desktop and iOS, and is maintained once. Against building separate native apps, that removes an entire category of duplicated work — you fix a bug or ship a feature in one place, not three.
Instant updates, no gatekeeping
A PWA updates the moment you deploy. There is no app-store review to wait on, no user download to nag, and no store commission on what you sell. Everyone is on the current version within a page load.
Discoverable by a link
Because a PWA is a website, it is indexed by search engines and shared by URL. You get organic discovery and frictionless sharing that a native app, hidden behind a store listing and a download, cannot match.
Why businesses choose Progressive Web Apps
- You want the widest possible reach for the lowest cost, and one web app that installs everywhere beats funding two or three native builds you must then keep in step.
- Offline or poor-network use is central to the product, and a service worker that caches content and queues actions is exactly the capability you need.
- You value shipping fast and updating instantly over app-store presence, and the review queue and store commission are friction you would rather not carry.
- You want a single team, working in standard web technologies, to own both your website and your app — with senior judgement on where a PWA’s limits will and will not bite you.
What we build with Progressive Web Apps
The capabilities this technology is genuinely strong at — and what we most often build with it.
Service workers
A service worker is a script the browser runs in the background, between your app and the network, that can intercept every request. It is the engine of a PWA — it makes offline work possible, controls what is served from cache versus the network, and powers background features. We design its caching strategy deliberately, because a careless service worker is the fastest way to serve users a stale, broken app.
Web app manifest and install
A small manifest file tells the browser your app’s name, icon, theme colour and how it should launch, which is what lets a user install it to the home screen and open it full-screen without browser chrome. We get the install experience right across platforms — including the extra prompting iOS requires — so it feels deliberate rather than accidental.
Offline and caching strategies
Offline is not a single switch; it is a set of choices. We pick the right strategy per resource — cache-first for the app shell, network-first for fresh data, stale-while-revalidate where a slight lag is acceptable — so the app stays usable on no connection without ever quietly showing yesterday’s numbers as though they were today’s.
Push notifications
Where the platform supports it, a PWA can send push notifications through the browser to re-engage users. We are precise about coverage here: this works well on Android and desktop, arrived late and remains more limited on iOS, and we scope any notification-dependent feature against what your actual audience’s devices can do rather than the best case.
Background sync
Background sync lets an action taken offline — a form submitted, a change saved — be queued by the service worker and sent automatically once the connection returns, without the user having to retry. For field and mobile use on patchy networks this turns a frustrating experience into a reliable one, and we build it where the workflow genuinely needs it.
App-like UX and responsiveness
A good PWA feels like an app, not a website in a shell: responsive layouts that suit a phone in the hand as much as a desktop, an app shell that paints instantly, smooth transitions, and respect for touch, gestures and safe areas. This is craft, not a checkbox, and it is the difference between users keeping the icon and deleting it.
Use cases
Content and media platforms
News, reading, reference and learning apps where reach and search discovery matter and offline reading is a genuine benefit — a natural fit for a PWA over a costly native pair.
Field and low-connectivity tools
Apps for engineers, drivers, inspectors or clinicians who work in basements, warehouses or rural areas, where offline caching and background sync keep the tool working when the signal does not.
Storefronts and booking flows
E-commerce and reservation experiences that must load fast, rank in search and convert on mobile, installed to the home screen for returning customers without the drop-off of a store download.
Internal and utility apps
Employee tools, dashboards and single-purpose utilities distributed by a link and updated instantly, where paying for native builds and store submissions would be effort spent for no return.
When Progressive Web Apps is the right choice
- Right when reach and cost matter more than depth: you want one thing that works on Android, desktop and iOS, is found in search, and does not need to pass through an app store. This is a PWA’s home ground.
- Right when offline or poor-network support is the point — a field tool, a travel or transit app, a reference app used underground or on a train — where a service worker caching content and queuing actions is the whole value.
- Right when you want instant updates and no gatekeeping: every deploy reaches every user immediately, with no review queue and no fraction of revenue paid to a store.
- Wrong for products that need full native device access — Bluetooth peripherals, deep camera and sensor control, tight OS integration — or graphics-intensive work like 3D games and heavy real-time rendering, where native performance and APIs are simply better.
- Wrong when app-store presence is itself a requirement — because your buyers look for you there, or trust an app they installed from a store more than a site they added to a home screen. A PWA is not in the stores by default, and on iOS its capabilities remain more constrained than on Android; if either fact is a dealbreaker, native or a cross-platform framework is the honest answer.
Progressive Web Apps: pros and cons
Strengths
- One codebase reaches Android, desktop and iOS and is maintained once — far cheaper to build and run than separate native apps.
- Installs to the home screen and works offline via a service worker, so it feels like an app without the download or the store.
- Discoverable by search and shareable by URL, with instant updates on every deploy and no app-store review or revenue cut.
- Built on standard web skills and tooling, so the talent pool is deep and the same code powers your website and your app.
Trade-offs
- iOS and Safari have historically limited PWAs: install and push notifications were restricted for years and remain more constrained than on Android, and some device APIs are simply unavailable.
- A PWA cannot reach every native capability — certain sensors, Bluetooth, deep camera control and tight OS integration are out of bounds or patchy across browsers.
- It is not in the app stores by default. For audiences who look for you there, or trust a store-installed app more, that absence is a real discovery and credibility cost.
- For graphics-intensive or performance-critical work — 3D, games, heavy real-time rendering — native is faster and gives finer control; a PWA will feel like a compromise.
Architecture
A PWA’s architecture is a normal web application with a service worker and a manifest layered over it, and the service worker is where the real design decisions live. We settle its caching strategy first: what constitutes the app shell that should be cached and painted instantly, which data is fetched network-first so it is never stale, what falls back to cache when offline, and — the part teams forget — how a new version of the service worker is rolled out without trapping users on an old cached build. Getting the update and invalidation story right up front prevents the single most common PWA failure, which is users stuck on a broken or outdated version with no obvious way out.
Underneath, we build the app the way we would any serious front end — a component-driven UI, a clear boundary between the client and your API, and a rendering approach chosen for the job. For a PWA that also needs search visibility we render meaningful HTML on the server, typically with a framework like Next.js, rather than shipping an empty shell that only fills in once JavaScript runs. The service worker and manifest then enhance that solid, indexable base. That layering is deliberate: the app works as a plain website first, and the PWA capabilities are added on top, so nothing essential depends on a feature a given browser might not support.
Performance
Performance is most of why a PWA feels like an app, and the service worker is the lever. Once the app shell is cached, subsequent loads paint almost instantly because the browser is serving from the device rather than the network — the perceived speed that makes an installed PWA feel native. We pair that with the ordinary discipline of a fast front end: lean JavaScript bundles, code-splitting so each screen downloads only what it needs, correctly sized modern-format images, and a hard eye on Core Web Vitals, because a PWA that is slow to first load has thrown away its main advantage before the service worker ever engages.
We are honest about the ceiling. A PWA runs in the browser’s execution model, and for compute-heavy or graphics-intensive work — real-time 3D, heavy animation, large in-memory data — it will not match a native app with direct access to the platform’s rendering and threading. We measure on real mid-range devices rather than a fast laptop, because that is where the gap shows, and if your workload lives beyond what the web can do smoothly, we will tell you that native is the right tool rather than tune a PWA up to a wall.
Security
A PWA must be served over HTTPS — service workers and most of the capable web APIs simply refuse to run otherwise — so transport security is a baseline the platform enforces for you. Beyond that, the service worker itself is a security surface worth respecting: it sits between your app and the network with the power to intercept and cache responses, so we are careful never to cache sensitive or user-specific data where it should not persist, and we scope what it stores and for how long deliberately rather than caching everything by reflex.
The rest is standard, and non-negotiable: authentication and authorisation are enforced on the server, never merely hidden in the client, because anything shipped to the browser can be read and bypassed. Secrets never live in front-end code. We escape and sanitise rendered content to prevent cross-site scripting, keep the dependency tree small and current given how much of the web ecosystem is third-party code, and treat tokens, cookies and cache storage as decisions to make consciously, not defaults inherited from a starter template.
Scalability
A PWA scales the way any web front end does: the static assets and app shell are served from a CDN and cache trivially, so a spike in users is largely a spike in cheap, cacheable requests rather than load on your servers. The service worker helps further by satisfying repeat visits from the device itself, taking traffic off the network entirely. Real request load lands on your API and data layer, and that is where capacity planning belongs — the front end is rarely the bottleneck.
The harder scaling is organisational, as with any growing codebase: keeping the app coherent as features and engineers multiply. We use a component-driven structure, typed contracts via TypeScript, and clear ownership of state so a team can work in one codebase without it fragmenting. Because a PWA is a single codebase rather than a set of per-platform apps, that growth is genuinely cheaper to manage — there is one thing to keep clean, not three that must be kept in step with each other.
Progressive Web Apps integrations & ecosystem
The technologies we most often pair with it — each links to how we work with it.
How we work
We start by pressure-testing the fit. Before any code, we check that a PWA genuinely serves your users and your goals — that you do not need a device capability the web cannot reach, that app-store presence is not a hard requirement, and that your audience’s devices support the features your product depends on, iOS constraints included. If a PWA is the wrong shape, that is the moment to say so, and we will. If it is the right shape, we agree the caching and offline strategy and the rendering approach up front, because those are cheap to decide early and expensive to unpick later.
From there we build in thin vertical slices — a real feature, working in production, rather than a scaffold that looks complete and does nothing — and we add the PWA layer onto a site that already works as a plain, indexable website, so nothing essential rests on a capability a browser might withhold. The engineers who design it are the ones who write it and keep it running; we operate what we build, which means we test the install and offline behaviour on real Android and iOS devices, not just a desktop emulator, and we favour durable choices your own team can maintain long after we hand it over.
The service behind it
Delivered throughCustom Software DevelopmentWhat we build with Progressive Web Apps
The disciplines this technology most often shows up in — from a first build to taking over and stabilising an existing one.
How we deliver
- 01
Discover
We map the system, the constraints and the business it serves — including the parts nobody documented.
Architecture brief
- 02
Architect
Decisions get made, written down and defended before a line of production code exists.
Decision records
- 03
Build
Short cycles against working software. You see progress in the product, not in a status deck.
Shipping increments
- 04
Operate
Monitoring, incident response and iteration. The system is alive, so the engagement is too.
Runbooks & SLOs
Industries we use Progressive Web Apps in
Domain knowledge changes what gets built. A few of the sectors we know before the first meeting.
Also in Frontend
Why teams choose us for Progressive Web Apps
Senior engineers only
Service workers and offline caching are quietly full of sharp edges — stale caches, broken updates, users trapped on old builds. The people designing yours have hit those edges before, so you do not have to. There are no juniors learning on your project.
We operate what we build
We run the apps we ship, so we test install and offline behaviour on real devices and optimise for the eighteen-month maintenance reality, not the demo. That means a service worker your team can reason about, not a black box.
Honest about PWA limits
We will tell you plainly where a PWA falls short — the iOS constraints, the device APIs it cannot reach, the case for native — before you commit budget. If native or React Native is the right answer, we say so.
One team, site and app
Because a PWA is built in standard web technologies, the same senior team owns your website and your app in one codebase — no separate native shop, no duplicated work, no two roadmaps to keep in step.
Typical timeline
- 01
Fit and discovery
One to two weeks confirming a PWA is the right choice, agreeing the offline and caching strategy, the target platforms, and the rendering approach — before code volume grows.
- 02
First vertical slice
Two to three weeks delivering one real feature end to end in production, installable and working offline, proving the service worker design against real devices rather than a plan.
- 03
Iterative build
Feature-by-feature delivery in short cycles, each shippable, with install, offline and performance checked on real Android and iOS hardware as we go rather than at the end.
- 04
Hardening and handover
Core Web Vitals tuning, a verified service-worker update path, tests on the load-bearing flows, and documentation so your team can own and extend it.
How pricing works
- Fixed-scope builds for a well-defined PWA — a storefront, a field tool, a content app — quoted once we understand the offline requirements, the platforms that matter, and the data it works against.
- Progressive enhancement of an existing website into a PWA, priced by an assessment of what your current front end needs before a service worker and manifest can be added safely.
- Monthly senior engagement for ongoing product work, where the scope evolves and you want continuity and someone who runs the app rather than a fixed one-off deliverable.
- Focused audits for PWAs that misbehave — stale caches, broken updates, failing installs, poor offline behaviour — priced by the assessment.
Hire Progressive Web Apps engineers
Need Progressive Web Apps capacity on your own team? We embed named senior engineers into your existing team — reporting to your leads, working in your rituals — so you add capacity without a hiring cycle.
Hire Progressive Web Apps engineersCommon questions
Will a PWA work properly on iPhones?
Partly, and better than it used to, but with real caveats. iOS supports installing PWAs to the home screen and, since relatively recently, web push notifications — but both arrived years after Android and remain more constrained, and some device APIs are still unavailable in Safari. We test on real iPhones and scope any iOS-dependent feature against what actually works there, rather than assuming parity with Android. If your audience is heavily iOS and needs a capability Safari withholds, we will tell you before you build.
How is a PWA different from a native app?
A native app is built for a specific platform, installed from an app store, and can reach the full range of device capabilities. A PWA is a website enhanced to install and work offline, delivered by a URL, maintained as one codebase across platforms, and updated instantly with no store. The trade is reach and cost against depth: a PWA is far cheaper and more discoverable, but native goes deeper into the device and performs better for demanding, graphics-heavy work.
Should we build a PWA or use React Native or Flutter?
It depends on how much native depth you need. React Native and Flutter produce real native apps from one codebase and reach far more device capabilities than a PWA, at the cost of app-store distribution and a heavier build. A PWA wins when reach, search discovery, instant updates and low cost matter most and your feature set stays within what the web can do. When you need deep device access or store presence but still want a shared codebase, a cross-platform framework is usually the better call — and we will recommend it honestly.
Can a PWA really work offline?
Yes, and this is one of its strongest features. A service worker caches the app and its data on the device, so the app opens and functions with no connection, and background sync can queue actions taken offline and send them once the signal returns. The important caveat is that offline is a set of deliberate choices about what to cache and how fresh it must be — done carelessly it shows users stale data as though it were current, which is why we design the caching strategy explicitly rather than switching offline on and hoping.
Can a PWA be listed in the app stores?
Not by default — a PWA is distributed by a URL, which is part of its appeal and, for some audiences, a drawback. It is technically possible to wrap a PWA for store submission using tools such as Trusted Web Activities on Android, but that adds moving parts and does not lift the underlying platform limits. If app-store presence is a genuine requirement for your buyers or your credibility, that is a strong signal a PWA alone is the wrong choice, and we would steer you toward native or a cross-platform framework instead.
Building on Progressive Web Apps?
A technical conversation with the engineers who would do the work. If we are not the right fit, we will say so on the call.