The wrapped-website syndrome
An app that's just a website wrapped inside an app. That's exactly what triggers tons of Apple 4.2 rejections.
Sharing code between a desktop app and its browser version does not halve the work. Here is what the second platform actually cost, measured on a real case — and the three things that only show up in production.
Sharing a codebase between a desktop app and its browser version does not halve the work. On Arti — our floor plan editor for macOS, which also runs in a browser — the product logic was reused unchanged, but the web version needed its own hosting work, its own crash reporting and its own loading constraints. The code shares; shipping does not.
This is written from one real case rather than from a principle. The figures below were measured on the live deployment, not estimated.
The short answer: nearly everything you wrote, and none of what surrounds it. On Arti the whole editor is common to both platforms — drawing rooms, doors and windows that cut real openings, 244 furniture pieces at real dimensions, the switch to 3D, the export. There is no second implementation to keep in step, and a fix made once holds for both.
What does not share is the layer that touches the system: where files live, how an export is saved, and how a crash is reported. Those three look like footnotes on a plan. They are where the time goes.
On the Mac, a plan is a file in the app's container: it survives an update, it goes into the Time Machine backup, it is yours in the plainest sense.
In a browser, the same plan lives in browser storage on that one machine. Nothing is uploaded — the promise that your data does not leave holds — but a user can wipe it without realising, by clearing site data. This is not a technical defect, it is a wording problem: the page has to say where the plan lives and what deletes it, or the promise becomes a trap. On Arti the sentence sits permanently along the top of the web editor.
That is the first thing to budget for on a second platform: not the code, the text that explains what the code does differently.
An app compiled for the browser arrives all at once. On Arti a cold load is 13.2 MB raw, 4.7 MB compressed — and that compression is not an optimisation, it is the difference between an app that starts and a blank page on a mediocre connection. Your host either provides it or you configure it; in our case the server serves Brotli, which is better again than gzip.
Two deployment consequences that are rarely discovered in advance:
On mobile and on Mac, the standard crash reporter is provided and wires up in a few lines. It has no browser implementation and never has had one — this is not a configuration gap, and no amount of setup closes it.
So we wrote our own: a route that receives an anonymous report, groups it by fingerprint so one error in a loop cannot bury everything else, and keeps it for ninety days. The report carries no identifier, no address and no plan content — a random session id is enough to tell "one person triggered forty errors" from "forty people triggered one", which are not the same bug and do not have the same fix.
Counting this piece as free because it is free on mobile is the most common estimating mistake on a cross-platform project.
A link. That is all of it, and it is a great deal: someone hesitating can try the whole application, with no install and no account, from the page that describes it. Not a cut-down demo — the same app, the same catalogue, the same export.
For a product sold by download, that moves the visitor's question from "do I want to install this?" to "does it do what I need?". The second one answers itself in two minutes.
Three cases where the answer is an easy yes: your product is easier to try than to describe; your business users cannot install software freely; or your fix cycle is faster than an app store's review rhythm.
Three where it is no: you need hardware access a browser will not grant; your files are too large for browser storage; or your team cannot carry two separate releases, because that is what this is — one codebase, two deployments.
In short: budget the second platform at about a third of the first, not a tenth. The code genuinely shares. Hosting, wording and observability share nothing at all.
Arti is at artiplans.com, and the editor can be tried in the browser straight from that page.
12 years of experience, iOS + Android, one dedicated contact. Free 30-minute call to scope your need — no commitment, no jargon.
Book a call →
Sharing a codebase between a desktop app and its browser version does not halve the work. On Arti — our floor plan editor for macOS, which also runs in a browser — the product logic was reused unchanged, but the web version needed its own hosting work, its own crash reporting and its own loading constraints. The code shares; shipping does not.
This is written from one real case rather than from a principle. The figures below were measured on the live deployment, not estimated.
The short answer: nearly everything you wrote, and none of what surrounds it. On Arti the whole editor is common to both platforms — drawing rooms, doors and windows that cut real openings, 244 furniture pieces at real dimensions, the switch to 3D, the export. There is no second implementation to keep in step, and a fix made once holds for both.
What does not share is the layer that touches the system: where files live, how an export is saved, and how a crash is reported. Those three look like footnotes on a plan. They are where the time goes.
On the Mac, a plan is a file in the app's container: it survives an update, it goes into the Time Machine backup, it is yours in the plainest sense.
In a browser, the same plan lives in browser storage on that one machine. Nothing is uploaded — the promise that your data does not leave holds — but a user can wipe it without realising, by clearing site data. This is not a technical defect, it is a wording problem: the page has to say where the plan lives and what deletes it, or the promise becomes a trap. On Arti the sentence sits permanently along the top of the web editor.
That is the first thing to budget for on a second platform: not the code, the text that explains what the code does differently.
An app compiled for the browser arrives all at once. On Arti a cold load is 13.2 MB raw, 4.7 MB compressed — and that compression is not an optimisation, it is the difference between an app that starts and a blank page on a mediocre connection. Your host either provides it or you configure it; in our case the server serves Brotli, which is better again than gzip.
Two deployment consequences that are rarely discovered in advance:
On mobile and on Mac, the standard crash reporter is provided and wires up in a few lines. It has no browser implementation and never has had one — this is not a configuration gap, and no amount of setup closes it.
So we wrote our own: a route that receives an anonymous report, groups it by fingerprint so one error in a loop cannot bury everything else, and keeps it for ninety days. The report carries no identifier, no address and no plan content — a random session id is enough to tell "one person triggered forty errors" from "forty people triggered one", which are not the same bug and do not have the same fix.
Counting this piece as free because it is free on mobile is the most common estimating mistake on a cross-platform project.
A link. That is all of it, and it is a great deal: someone hesitating can try the whole application, with no install and no account, from the page that describes it. Not a cut-down demo — the same app, the same catalogue, the same export.
For a product sold by download, that moves the visitor's question from "do I want to install this?" to "does it do what I need?". The second one answers itself in two minutes.
Three cases where the answer is an easy yes: your product is easier to try than to describe; your business users cannot install software freely; or your fix cycle is faster than an app store's review rhythm.
Three where it is no: you need hardware access a browser will not grant; your files are too large for browser storage; or your team cannot carry two separate releases, because that is what this is — one codebase, two deployments.
In short: budget the second platform at about a third of the first, not a tenth. The code genuinely shares. Hosting, wording and observability share nothing at all.
Arti is at artiplans.com, and the editor can be tried in the browser straight from that page.
12 years of experience, iOS + Android, one dedicated contact. Free 30-minute call to scope your need — no commitment, no jargon.
Book a call →We write about mobile app development, user experience design, App Store optimization, project management, and industry trends. Our articles are based on real experience from client projects.
We aim to publish regularly with a focus on quality over quantity. Each article is written from hands-on experience, not generic advice.
Absolutely! Feel free to reach out via our contact page or book a consultation. We love hearing what questions our readers and clients have.
Most of my projects run remotely, and in practice that changes very little. We talk over video whenever you need to, not only at major milestones, and you can reach me with questions at any point during the project — I always answer.
You can also write to me directly on WhatsApp: same number I use every day, a French professional line that works internationally.