Generally, browser extensions cut across websites and web apps, while apps
provide more isolated functionality. Read on for specifics.

**This is a technical discussion of extension types for Chromium developers.**
Extension developers should refer to http://developer.chrome.com/ for
documentation, usage guidelines and examples.

[TOC]

## Extension types hierarchy

* Extensions
  * Browser extensions
  * Packaged Apps aka Chrome Apps:
    * Packaged App ("v1") - deprecated
    * Platform App ("v2") - deprecated
  * Hosted Apps - deprecated
    * Bookmark Apps - deprecated

## Browser extensions

Browser extensions often provide an interactive toolbar icon, but can also run
without any UI. They may interact with the browser or tab contents, and can
request more extensive permissions than apps.

A browser extension can be identified by a `manifest.json` file without any key
named `app`, `export`, or `theme`.

## Themes

A theme is a special kind of extension that changes the way the browser looks.
Themes are packaged like regular extensions, but they don't contain JavaScript
or HTML code.

A theme can be identified by the presence of a `theme` key in `manifest.json`.

## Shared Modules

Shared modules are permissionless collections of resources that can be shared
between other extensions and apps.

A shared module can be identified by the presence of an `export` key in
`manifest.json`.

## Apps

### Platform app

Platform apps (*v2 packaged apps*) are standalone applications that mostly run
independently of the browser. Their windows look and feel like native
applications but simply host the app's pages.

Most apps, like Calculator and the Files app, create their window(s) and
initialize a UI in response to Chrome's `chrome.app.runtime.onLaunched` event.
Some apps don't show a window but work in the background instead. Platform apps
can connect to more device types than browser extensions have access to.

A platform app can be identified by the presence of an `app.background` key
in the manifest, which provides the script that runs when the app is
launched.

*Platform apps are deprecated, and will be [supported until June 2022](
https://blog.chromium.org/2020/08/changes-to-chrome-app-support-timeline.html).*

### Packaged app (legacy)

[Legacy (v1) packaged apps](https://developer.chrome.com/extensions/apps)
combined the appearance of a [hosted app](#Hosted-app) -- a windowed wrapper
around a website -- with the power of extension APIs. With the launch of
platform apps and the app-specific APIs, legacy packaged apps are deprecated.

A packaged app can be identified by the presence of an
`app.launch.local_path` key in `manifest.json`, which identifies the resource
in the .crx that's loaded when the app is launched.

*Packaged apps are deprecated everywhere.*

### Hosted app

A [hosted app](https://developer.chrome.com/webstore/hosted_apps) is mostly
metadata: a web URL to launch, a list of associated URLs, and a list of
permissions. Chrome asks for these permissions during the app's installation.
Some permissions allow the associated URL to bypass runtime permission prompts
of regular web features. Other than metadata in the manifest and icons, none of
a hosted app's resources come from the extension system.

A hosted app can declare a BackgroundContents, which outlives the browser and
can be scripted from all tabs running the hosted app. Specifying
`allow_js_access: false` is preferred, to allow multiple instances of the hosted
app to run in different processes.

A hosted app can be identified by the presence of an `app.launch.web_url` key in
`manifest.json`, which provides http/https URL that is loaded when the app is
launched.

*Hosted apps are deprecated, and will be [supported until June 2022](
https://blog.chromium.org/2020/08/changes-to-chrome-app-support-timeline.html).*

### Bookmark app

Prior to Oct 2020, bookmark apps were based on the Extensions system. At that
point they were migrated to the [Web App](#Web App) system, but are still called
bookmark apps. This section is about bookmark apps based on Extensions
(deprecated).

A bookmark app was a simplified hosted app that Chrome created on demand. When
the user tapped "More Tools > Add to desktop..." (or "Add to shelf" on Chrome
OS) in the Chrome menu, Chrome created a barebones app whose manifest specified
the current tab's URL. A shortcut to this URL appeared in chrome://apps using
the site's favicon.

Chrome then created a desktop shortcut that would open a browser window with
flags that specify the app and profile. Activating the icon launched the
"bookmarked" URL in a tab or a window.

*Bookmark apps based on Extensions are retired.*

### Web App

When Progressive Web Apps (PWAs) are installed on desktop a
[Web App](/chrome/browser/web_applications/README.md) is created (no longer
based on the Extensions system since Oct 2020). The web app may capture
navigations to its scope and open them in a dedicated app window instead of the
existing browser context.

Due to the migration from bookmark apps, web apps are often still referred to as
bookmark apps in code and documentation. Not to be confused with "shortcut
apps", which are web apps that Chrome creates on demand when the user taps "More
Tools > Create Shortcut...".

## Ambiguity surrounding the term "Extension"

In the C++ code, all of the above flavors of extensions and apps are implemented
in terms of the `Extension` class type, and the `//extensions` module. This can
cause confusion, since it means that an app *is-an* `Extension`, although
`Extension::is_extension()` is false.

In code comments, "extension" may be used to refer to non-app extensions, also
known as *browser extensions*.

The three categories of apps are significantly different in terms of
implementation, capabilities, process model, and restrictions. It is usually
necessary to consider them as three separate cases, rather than lumping them
together.

## See also

* [`Manifest::Type` declaration](https://cs.chromium.org/chromium/src/extensions/common/manifest.h?gs=cpp%253Aextensions%253A%253Aclass-Manifest%253A%253Aenum-Type%2540chromium%252F..%252F..%252Fextensions%252Fcommon%252Fmanifest.h%257Cdef&gsn=Type&ct=xref_usages)
* Extensions (3rd-party developer documentation)
    * [Extension APIs](https://developer.chrome.com/extensions/api_index)
    * [Extension manifest file format](
      https://developer.chrome.com/extensions/manifest)
* Apps (3rd-party developer documentation)
    * [Platform app APIs](https://developer.chrome.com/apps/api_index)
    * [Platform app manifest file format](
      https://developer.chrome.com/apps/manifest)
    * [Choosing an app type](https://developer.chrome.com/webstore/choosing)
    * Ancient article introducing the [motivation for apps (outdated)](
      https://developer.chrome.com/webstore/apps_vs_extensions)
