Firefox add-ons are generally grouped into Extensions, and then "other types" of Firefox add-ons.
Extensions allow Firefox to be customized by adding to or modifying the functionality of Firefox. Some of the types of things which can be done with extensions include:
Firefox extensions are, primarily, written in JavaScript with the addition of some JavaScript APIs.
Firefox add-ons, particularly extensions, are in a state of flux at the moment. Mozilla has announced, and confirmed, that they have deprecated all types of Firefox extensions, except WebExtensions, and that all non-WebExtensions based extensions will be disabled in Firefox 57, which is scheduled for 2017-11-14.
Firefox has four types of extensions (all of which are commonly referred to as add-ons):
WebExtensions: Moving forward, WebExtensions are the only type of Firefox extension which will be supported. These add-ons are described by a manifest.json file. This API is similar to what is used for Google Chrome extensions. These add-ons use HTML and CSS in addition to Javascript. While Mozilla has stated that this API is the future of Firefox extensions, this API is still in development. For now, you are probably best off developing and testing your WebExtension add-on with Firefox Developer Edition, or Firefox Nightly. You should also make careful note of what version of Firefox is required for the functionality you desire to use. This information is contained in the "Browser compatibility" section of the MDN documentation pages.
WebExtensions use a significantly different API than the other three types of extensions. There is, intentionally, no ability to use the interfaces provided by any of the other add-on types.
Add-on SDK: [deprecated; scheduled for removal] These add-ons are described by a package.json file which is initially generated by executing jpm init . These extensions will often use require() to load either High-Level, or Low-Level APIs to interface with Firefox. These add-ons use HTML and CSS in addition to Javascript. Currently, these add-ons are wrapped into a bootstrapped extension when they are loaded for testing by jpm run or consolidated into an .xpi file by jpm xpi for distribution (i.e. upload to AMO/Mozilla). In other words, they are bootstrapped extensions with an SDK wrapper.
Mozilla appears to be committed to continuing to support Add-on SDK based extensions as long as the extension does not use require("chrome") , or otherwise depend on XUL, XPCOM, and XBL.
Most of the things that can be done in a bootstrapped extension can be done in an Add-on SDK based one. However, many such things bypass the SDK which forfeits a significant portion of the benefits of using the Add-on SDK.
Bootstrapped: [deprecated; scheduled for removal] These extensions are also commonly called "restartless" because they were the first type of Mozilla extension which did not require the application to be restarted in order to load/unload the add-on. However, restartless is a descriptor of how they function. Using "restartless" as the name for this type of add-on is confusing because both Add-on SDK and WebExtension add-ons also do not require the application to be restarted upon load or unload of the add-on. For that reason, there is a tendency to no longer use "restartless" as the name for this type of add-on.
These add-ons use HTML and CSS in addition to Javascript. Many also interact with Firefox using XUL.
These add-ons have a JavaScript file called bootstrap.js which must contain