What it actually takes to wrap a site as an app

Every guide to this makes it look like two menu clicks. Open the page, pick an item, name it, done. Then the app launches to a signed out screen, or notifications never arrive, or the icon in the Dock is a blurry favicon stretched to 128 pixels, and the whole thing gets abandoned inside a week. The failures are predictable, and none of them come from picking the wrong tool. They come from four decisions that were never made before the tool was opened.

The four inputs, in the order they matter

Wrapping a site is not a build step. Nothing is compiled, nothing extra is downloaded from the site's servers, and the page inside the window is rendered by the same engine that renders it in a tab. What changes is the container. Because there are several ways to build that container, and each one asks for something different, the same two clicks produce very different results for different people.

The inputs are these:

  • The environment: which macOS version is running and which browsers are installed
  • The site: whether it was built with an app install in mind
  • The session: whether the login should be shared with the browser or kept separate
  • The presentation: a square image and a name short enough to scan in the Dock

The third one is the only input that is expensive to change later. Where the session lives is fixed the moment the container is built, and moving it means rebuilding. The first and fourth can be corrected at any point. That ordering is the whole method: check the environment, look at the site, decide the session, then handle the icon.

The environment sets which routes exist at all

Start with the About This Mac panel. The macOS version decides whether the cheapest route is on the menu at all.

From macOS Sonoma 14 onward, Safari can save any open page as a web app through File then Add to Dock. Nothing to install, nothing to pay for. On anything older that menu item does not exist, and the choice narrows to a browser based route or a dedicated tool.

Chrome adds a second option if it is installed. Chrome can install a page as an app, and the resulting window keeps Chrome extensions working inside it, which matters for password managers and clipping tools. The cost is that the app hangs off the Chrome profile that created it. Delete or rebuild that profile and the app stops being useful.

One more environment check is worth thirty seconds: the machine's processor. Third party wrappers vary in whether they ship builds for Apple Silicon, Intel, or both, and in how far back their supported macOS version goes. That information sits on the download page. Reading it first avoids installing something that will not launch.

Whether the site was built for this changes the result

Two sites wrapped by the same method can come out looking completely different, and the reason sits on the site's side rather than the Mac's.

The web platform has a file that describes how a page should behave when it is installed: the name to display, a set of icons at usable sizes, and how much browser chrome to show on launch. Sites that ship one come out of the wrap with a correct name and a crisp icon. Sites that do not ship one come out named after whatever the page title happened to be, with an icon scaled up from a 32 pixel favicon. Google's web.dev learning material covers what that file contains.

Checking takes a moment. Open the site in Chrome and look at the right side of the address bar. An install icon there means the site declares itself installable. No icon does not block anything, it just means the name and the artwork are now the user's problem.

Internal admin panels, older SaaS dashboards, and anything built before roughly 2018 usually fall in the second group. If the first app comes out with a fuzzy icon, that is the site telling you it has no artwork to give, and the fix is to pick a route that accepts a custom image rather than to try the same route again.

Where the session lives is the decision that sticks

This is the input that produces the most confusion, because the symptom looks like a bug. The new app opens and asks for a login that the browser already has. Apple's support documentation states plainly why:

A web app functions independently of Safari. It shares no browsing history, cookies, website data, or settings with Safari. Source: support.apple.com

So there are two models to choose between.

A shared session inherits whatever the browser already has. Chrome's install route works this way, and the app is usable the second it exists. The trade is that a second account of the same service cannot be open at the same time, because the app follows the profile.

An isolated session keeps its own cookie store and starts signed out. Safari web apps and most dedicated wrappers work this way. There is one extra sign in at the start, and in exchange two accounts of the same service can sit in two windows simultaneously. For anyone who has been switching browser profiles to move between a work account and a personal one, that single property is usually the reason the whole exercise is worth doing.

The test is simple. If a service ever needs to be open under two identities, pick isolation. If it never does, sharing costs less. One practical note: with isolation and two factor authentication, the first launch will ask for a code, so it helps to have the authenticator to hand rather than discovering it mid task.

The icon and the name are cheap, but not free

The presentation input is last for a reason, though it does need actual materials:

  • A square image, 1024 pixels on a side, so it stays sharp in the Dock, in Command Tab, and in Spotlight results
  • A short name, because the Dock tooltip is what gets read when two icons look alike

Whether the image can be applied depends on the route. A Safari web app exposes its own Settings panel from the menu bar, where the display name, the icon, and even the target URL can be changed after the fact. A Chrome installed app uses whatever the site declared and offers no replacement path.

The name matters more than it sounds. Three apps with similarly coloured icons sitting next to each other in the Dock puts you right back to hovering and reading labels, which was the original problem with tabs. Deliberately choosing icons in different colour families for services that look alike is a two minute step that keeps the Dock scannable at a glance.

What each route asks for, and returns

Safari, Add to Dock Chrome, Install page as app Dedicated wrapper
Requires macOS Sonoma 14 or later Any current Chrome An install, sometimes a payment
Works without a site manifest Yes Yes Yes
Session Isolated, signs in again Shared with the Chrome profile Isolated per app
Second account, same service Works Blocked by the profile Works
Custom icon Yes, in the app's Settings No, taken from the site Usually yes
Extensions Safari extensions, per app Chrome extensions work Varies by tool
Lives in Applications folder in your home folder Managed by Chrome A normal app bundle

Chrome's route is the only one on that table that shares a session, which is also the only property the other two cannot reproduce. Everything else in the table is a matter of degree.

Four things wrapping will not fix

Expectations drift, so it is worth naming what does not change.

Speed is the first. The page inside is identical, served over the same connection and painted by the same engine. What disappears is the time spent locating the right window, which feels like speed but is not.

Offline use is the second. Unless the site itself implements offline behaviour, an app with no network shows the same nothing that a tab with no network shows. The container has no say in it.

Enterprise single sign on is the third. Login flows that redirect across several domains sometimes fail to complete inside an embedded browser view. Before wrapping a dozen internal tools, wrap one, use it long enough for the session to expire, and confirm the re authentication completes. A flow that breaks on day fourteen is far more expensive to discover than one that breaks on day one.

Memory is the fourth. A wrapper that ships its own Chromium engine costs roughly a second browser per app. A wrapper built on the WebKit engine macOS already has loaded costs closer to a tab. Below three apps this is noise. Past ten it is the main difference between the routes.

Which site to start with

Having the four inputs does not say which site to wrap first, and starting with the wrong one wastes the week that follows. Two numbers settle it: how many times a day the site gets opened, and how long each visit lasts.

High frequency plus long dwell is the case that pays. Mail, chat, a calendar, an internal dashboard. High frequency with a two second visit is the case that does not, because opening and closing a dedicated window costs more attention than the tab ever did. Anything opened weekly belongs in bookmarks.

There is also a ceiling. Past roughly fifteen icons, the Dock stops being scannable and reading labels starts again, which recreates the exact problem that tabs caused. Wrapping five sites at once also blurs the diagnosis: when something feels wrong afterwards, it is no longer clear which route caused it. Build one, live with it for a week, then write down what was missing. Whether the gap turns out to be notifications, a second account, or an unreadable icon is what determines the next route.

Reading a tool's service list before its feature list

If the four inputs point toward a dedicated tool, two pieces of information predict the outcome better than any feature checklist.

The first is the list of services the tool already handles. Some ship with more than 300 presets, and scanning that list of supported services shows what the tool was actually designed around. A catalogue made entirely of chat and mail apps suggests that wrapping an internal admin panel was never a target use. What can be configured per app is visible on the features page, and how granular the setup really is comes through in the guide.

The second is the shape of the pricing and the supported OS range, both of which are worth checking before installing rather than after. Most of the questions that come up during the first hour are already answered on a tool's FAQ.

None of the three routes excludes the others. Sites needing two accounts go to Safari, sites needing an extension go to Chrome, and only the ones needing a custom icon or link control justify a dedicated tool. Setups that survive a year are almost always mixed, which is the real reason to separate the four inputs: not to pick one tool, but to send each site down the route that fits it.

What to change first

Take the single site opened most often and give it one app, by the cheapest route that satisfies the session decision, then use it for a week before building anything else. If the sticking point turns out to be a second account, a custom icon, or a link that keeps escaping back into the browser, that is the point where a tool like Kagemusha starts to pay for itself.

Frequently asked questions

Does turning a site into an app require the site to support it?

No. Any URL can be wrapped by any of the three routes. What the site's own manifest changes is the quality of the result, specifically whether the app gets a proper name and a sharp icon automatically. Sites without one still work, they just need an icon supplied manually.

Why does the new app ask for a login the browser already has?

Safari web apps keep no cookies, history, or website data in common with Safari, so the first launch always starts signed out. It is a design decision, not a fault. That same isolation is what allows two accounts of one service to stay signed in at the same time in two separate apps.

How many sites are worth turning into apps?

The useful test is frequency times dwell time. A site opened several times a day and used for minutes at a stretch earns an icon. A site opened weekly does not, and a bookmark serves it better. Somewhere past a dozen icons the Dock stops being scannable, which cancels the benefit that motivated the exercise.

Will these apps keep working after a macOS or browser update?

Routes built into Safari and Chrome follow those applications and update with them. Apps produced by a third party wrapper depend on that tool continuing to track changes in macOS, so checking when a tool last shipped a release is a reasonable proxy for how long its output will keep working.

Back to all posts