A companion web app is the browser-side surface of a product that lives primarily in a mobile app: the place where a customer signs up before installing, where a shared link opens for someone without the app, where work started on a phone continues on a desktop. It is the same product, on the same API, shaped for what a browser is actually good at, rather than a port of the app or a brochure about it.
Most agencies build one side or the other. We ship Flutter apps, web frontends, and the backend services both consume — which changes the engineering, because the question "which surface should this feature live on" gets answered by one team looking at one system, not negotiated across two contractors.
The products we build
- Customer web apps alongside mobile apps — the full product in the browser where that makes sense, or the deliberate subset where it does not
- Public, shareable surfaces — the pages a shared link resolves to, rendered and indexable, that hand off into the app when it is installed
- Real-time web clients — live data in the browser from the same feed the apps consume
- Back offices for the same product — the operator-facing side is its own discipline, covered on admin panels & dashboards
- The web side built on Nuxt — when the companion surface must rank, the machinery is our Nuxt development practice
Who Builds Your Companion Web App
Two products in production show the pattern, each with an app and a web surface sharing one backend.
Formtastic — one platform, three clients
Formtastic runs as a Nuxt web application plus Flutter apps for iOS, iPad, and Android, all against the same Django and Go backend. The instructive part is how features land differently per surface: voice-to-text on the web records audio in the browser and sends it to a transcription endpoint, because a backend was already there to extend — while the mobile apps bundle Whisper on-device, because job sites have no signal. Same feature, two implementations, each honest about its surface. That judgment, more than framework skill, is what a two-surface product actually requires.
ExtraETF — one real-time feed, every client
For ExtraETF, we built the Go WebSocket service that broadcasts live market data to both web and mobile clients — thousands of simultaneous connections, updates conflated to the cadence a human watching a price actually needs. We built the mobile apps and the real-time layer; the web client consuming it belongs to the client's own team — which is precisely the point. A well-designed service feeds surfaces you will never build yourself.
What a Two-Surface Product Actually Demands
Four disciplines keep an app and a web surface from drifting into two products.
One API that serves both honestly
The moment the web needs "just one special endpoint," you have two backends wearing one name. We design the API as the product's single contract — the same authentication, the same models, the same versioning for every client — and where the surfaces genuinely need different shapes of data, that difference is written into the contract rather than patched into a client.
Deciding what the web version is
The expensive mistake is "the app, but in a browser." A companion surface earns its budget by doing what the app cannot: being reachable from a search result, opening instantly from a shared link, offering a keyboard and a big screen for heavy editing. We scope the web surface feature by feature against that test — and cutting a feature from the web version is a decision we will argue for out loud, not a gap discovered later.
The handoff between web and app
A shared link should open the app when it is installed, the web page when it is not, and never a broken interstitial. Universal links on iOS and app links on Android, the fallback pages behind them, and the sign-up flow that starts in a browser and continues in the app — this seam is where two-surface products most visibly leak users, so we engineer it deliberately instead of assuming it works.
Rendering matched to the page's job
The public, shareable pages render on the server so crawlers and link previews see real content; the logged-in workspace behind them renders like the application it is. The trade-offs are laid out on the web development pillar, and the choice is per route, not per project.
How We Work
Fixed-scope build. We take the web surface from feature scoping through deployment, against your existing API or one we build alongside it.
Staff augmentation. Our engineers join the team that owns the product — see team augmentation. If the mobile side needs building too, that is our Flutter practice.
Either way, we send a scoped quote within two business days of understanding the requirements.
What a Companion Web App Costs
A companion surface is priced from the same published tiers as the web development page: an authenticated web app on your existing API sits in the web app tier at $15,000 – $40,000, while a full second surface with real-time features, payments, or multi-tenant structure prices as SaaS-grade work from $50,000+.
These are the same keys that render the pillar's pricing table, so the two cannot drift. What moves the number: how much of the API already exists and how cleanly it was designed for more than one client, how much of the product the web version covers, and whether real-time features ride an existing feed or need one built.
Frequently Asked Questions
Common questions from teams whose product lives in an app and keeps being asked for in a browser.
See both surfaces in the Formtastic case study, read how the ExtraETF real-time feed fans out to every client, or start from the web development pillar.
