Clientlibs
Clientlibs allow you to extend the default implementation to realize new functionality, while reusing the standard functions, objects, and methods. When customizing, you can create your own clientlib under /apps. For example it can hold the code required for your custom component.

Overlays
Overlays are based on node definitions and allow you to overlay the standard functionality (in /libs) with your own customized functionality (in /apps). When creating an overlay a 1:1 copy of the original is not required, as the sling resource merger allows for inheritance.

These can be used in many ways to extend your AEM consoles. A small selection are covered below (at a high level).

To use the new console (for example in the rail for navigation) an ID is used, so that it can be explicitly referenced. The ID is used to connect the console and its navigation definition. The ID is defined in the rail node of the page; for example, for the Sites console:

the rail node is:/libs/wcm/core/content/sites/jcr:content/body/rail

here the currentId property is defined:currentId = cq-sites

For the Launches console example:

the node is:

/apps/<yourProject>/admin/ext/launches/content/jcr:content/body/rail

with the following properties:

currentId = cq-launches

sling:resourceType = granite/ui/components/endor/navcolumns

srcPath = cq/core/content/nav

Customizing the Default View for a Console

You can customize the default view (column, card, list) for a console:

You can reorder the views by overlaying the required entry from under:

/libs/wcm/core/content/sites/jcr:content/views

The first entry will be the default.

The nodes available correlate to the view options in the rail:

column

card

list

For example, in a overlay for list:

/apps/wcm/core/content/sites/jcr:content/views/list

Define the following property:

Name: sling:orderBefore

Type: String

Value: column

aem-admin-extension-customize-sites is a sample package showing how to customize an existing AEM 6 admin console. This package provides updates to Sites administration:

If you want to plug additional data, you need to write a PageInforProvider with a pageInfoProviderType property.

For example, see the class/bundle attached (from GitHub) below.

You can now select the column in the column configurator of list view.

Filtering Resources

When using a console, a common use case is when the user must select from resources (e.g. pages, components, assets, etc.). This can take the form of a list for example from which the author must choose an item.

In order to keep the list to a reasonable size and also relevant to the use case, a filter can be implemented in the form of a custom predicate. See this article for details.