Important:
Chrome will be removing support for Chrome Apps on Windows, Mac, and
Linux. Chrome OS will continue to support Chrome Apps. Additionally,
Chrome and the Web Store will continue to support extensions on all
platforms.
Read the announcement and learn more about
migrating your app.

Transitioning from Chrome apps on Windows, Mac, and Linux

Chrome packaged and hosted apps will be discontinued on Windows, Mac,
and Linux over the course of now and early 2018.
For more information, refer to the August 2016
Chromium blog post.
This transition does not apply to Chrome OS,
where Chrome packaged and hosted apps will remain supported and maintained for the foreseeable future.

To transition away from a Chrome packaged or hosted app on Windows, Mac, and Linux,
the following options are available.

Chrome packaged apps

Recommended migration options for packaged apps are listed
in order from simplest to most complicated.

Build a web app

Building a web app on top of the web platform is the ideal way
to reach users across platforms.

If there are web platform features you need that are only available in select browsers,
you can use feature detection to gracefully degrade or include explanatory text
when your app is run in a browser that doesn’t support a particular API.
If there are gaps in the web platform for your application, please
let us know.

An experimental tool that can help migrate simple Chrome Apps to
Progressive Web Apps
is Caterpillar.
This tool can insert JavaScript to substitute Chrome Apps APIs you might be using.
It is currently limited to handling only certain types of apps.
In particular,
apps that contain processing in background pages will not be converted.

As Chrome extensions can’t be run on other browsers,
you should detect when required functionality isn’t available and
provide explanatory text for users on these other browsers.

Build an extension

Depending on the user experience you want to provide,
it might make sense to convert your app over to an extension.
For example you could provide a
browser action
button which shows a small popup window for your user interface,
or navigates to a page your extension provides.
For some apps,
this might be a good enough user experience to be a viable solution.

Note there are significant costs to this approach.
Users that do not use Chrome will not be supported,
and there will be significant friction for your users to install your extension.

Build a native app

If no other options work for you, or don’t work well,
you may need to create a native app.
Using a framework such as
Electron or
NW.js,
you will be able to keep your existing JavaScript codebase.
Note that chrome.* API calls are not by default available on these platforms,
but similar APIs based on Node.JS are.

FAQs

Q: My Chrome App has many users.
What’s the best way to migrate them to my new web app and
deprecate my Chrome App?

You will still be able to publish updates to your Chrome App
until the runtime is removed in early 2018.
We recommend updating your app to include a message indicating
that your app has been discontinued,
and that users should visit your website going forward (see example below).
You can also include an “uninstall” button that calls the
uninstallSelf function.

Q: I want to continue to have a UI affordance
that enables users to launch my app from the taskbar/dock/app shelf.
What should I do?

Q: I want my app to run in its own window, not in a tab.
Is this something I can do with a web app?

Yes, but it is up to the user. On desktop platforms other than OS X,
users can add ‘bookmark apps’ to their shelf / desktop,
which optionally run your web app in its own window.

Q: My app needs to customize the window frame
(e.g. remove the close button). Can I do this with a web app?

Window frame customization is not possible with a web app or extension.
If this is necessary for your application you may want to consider using a tool
like Electron or NW.js to wrap your application.

Q: My app supports keyboard shortcuts.
Can the web support this also?

Web apps can support keyboard shortcuts by listening to the various key events
(e.g. keydown),
but the shortcuts you can support are limited. For example,
you cannot intercept Ctrl+N, Ctrl+T etc. as these are used by the browser.
Or, these might be shortcuts that are handled by the operating system
(e.g. Alt+Tab on Windows).

Work has begun
to allow developers to intercept these additional shortcuts on the web,
but this is not yet ready for use.

The Extension Commands API
supports richer keyboard shortcuts which operate across the entire browser,
which may enable new capabilities if transitioning to an extension is possible.

Q: My app needs to run when the user is offline.
Can I do that with a web app?

Q: My app needs to be able to show notifications
to the user even when it has no windows open. Can I do that with the open web?

Q: My app uses chrome.bluetooth/chrome.usb
to talk to a Bluetooth/USB device. Can this be done on the open web?

There are now proposals for new
Web Bluetooth
and
WebUSB standards,
designed to allow this functionality.
A subset of the Web Bluetooth API is now enabled in Chrome on Android, Chrome OS, and Mac.

Q: My app uses the chrome.fileSystem API to read
and write user-specified files and / or directories.
Can this be done on the open web?

In general, no.
The open web can read single files that the user opens,
but cannot retain access to those files, write to those files,
or have any access to directories.

If it is critical for your app to read and write directories
(e.g. it is a text editor with a folder view),
you will need to either have a
native helper app and extension combo,
or create a native app.

Q: My app uses the chrome sockets API to do networking.
Can this be done with the open web?

You might be able to do what you need with
WebSockets.
However, to use this, you will likely need to change the remote end of your connection.
If that isn’t possible
(e.g. you’re connecting over an established protocol like IRC or SSH),
you’ll need some sort of native component.

Chrome hosted apps

FAQs

Q: My hosted app uses the notifications permission.
How do I do that on the web?

Q: My hosted app uses the unlimitedStorage permission.
How do I do that on the web?

The unlimitedStorage permission ensured that data you store was ‘Persistent’,
which means it can only be cleared manually by the user.

The recommended alternative is to use
Persistent Storage
in your web app.
As of Chrome 52, Persistent Storage is available as an
Origin Trial.
To use this API in Chrome Stable,
you will need to request a token and insert it in your web application.

Q: My hosted app uses the geolocation permission.
How do I do that on the web?

Note: As of Chrome 50,
the Geolocation API will only work on secure contexts such as HTTPS.
If your site is hosted on an non-secure origin (such as HTTP),
the requests to get the user’s location will no longer function.

Q: My hosted app uses the background permission.
How do I do that on the web?

To ensure minimal power consumption we have been careful
about introducing a generic method for sites to run in the background
on user’s devices.

As of Chrome 49,
sites can ensure actions taken by the user are synced to the server using the
Background Sync API.
This API allows sites to run some limited code in the background
when the device re-connects to the internet,
even if the tab has since been closed.
Note that this API doesn’t allow for the service worker
to be woken up periodically.

In the future,
we hope to introduce a quota-limited ability for sites to wake up their service worker
by sending a push message but without being required to show the user a notification.
You can follow the progress of this work by starring
this issue
in the Chromium Issues Tracker.

Q: My hosted app uses the clipboardWrite permission.
How do I do that on the web?

Q: My hosted app uses the clipboardRead permission.
How do I do that on the web?

We are currently working on bringing the ability to read the clipboard
to the web and you can star
this issue
to be kept up to date.
Until then you may consider building an extension with the clipboardRead permission
to provide the functionality to your web app.