# Modules in Apostrophe

Every Apostrophe site is made up of modules. You can browse the complete list at left.

# Overview

Each module provides a particular feature, often including both front and back end code, as well as templates and stylesheets. For instance, the apostrophe-assets module provides core services relating to assets like stylesheets.

Modules are implemented as moog types, which provide a simple and clean way to write them in an object-oriented style while keeping async programming convenient and providing easy subclassing and overriding.

For convenience, the apostrophe npm module contains all of the "core" Apostrophe modules that are necessary for a functioning website.

Some of these, like apostrophe-docs, are initialized every time Apostrophe starts up; you can see that list on github (opens new window). Those modules are initialized first, followed by those you configure in app.js, in the order you configure them.

Others, like apostrophe-pieces and apostrophe-widgets, are "abstract base classes" you can extend to create new modules that provide content types.

apostrophe-module is the base class of all modules; it provides features that are convenient in almost any module, like rendering a template from its views folder, or pushing assets from its public folder.

Modules can also be installed via npm, and multiple Apostrophe modules can be shipped as a single npm module via moog bundles.

# Overriding, configuring and extending modules at "project level"

Any options you provide for a module via the modules property in app.js override the default configuration for a module, as described in the technical overview. And any configuration provided via the modules property in data/local.js overrides that, allowing for server-specific settings like API keys.

You can also provide your own templates in the lib/modules/module-name/views folder of your project (not in node_modules) to override the templates of module-name, and provide your own code in lib/modules/module-name/index.js to override methods and add functionality. If your project-level lib/modules folder has a module by the same name as a core or npm module, any code you provide automatically subclasses and improves that module.