Customizing the Consoles (Touch-Optimized UI)

AEM provides various mechanisms to enable you to customize the consoles (and the page authoring functionality) of your authoring instance (touch-optimized UI).

  • Clientlibs
    Clientlibs allow you to extend the default implementation to realise new functionality, while reusing the standard functions, objects and methods. When customizing, you can create your own clientlib under /apps; for example to 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).


For further information see:


You must not change anything in the /libs path.

This is because the content of /libs is overwritten the next time you upgrade your instance (and may well be overwritten when you apply either a hotfix or feature pack).

The recommended method for configuration and other changes is:

  1. Recreate the required item (i.e. as it exists in /libs) under /apps
  2. Make any changes within /apps

For example, the following locations within the /libs structure can be overlaid:

  • consoles (any consoles based on Granite UI pages); for example:
    • /libs/wcm/core/content
  • secondary (inner) rails; for example:
    • /libs/wcm/core/content/search
  • toolbar(s) (dependent on console; for example sites):
    • default
    • selection mode
  • help menu options (dependent on console; for example sites):
    • /libs/wcm/core/content/sites/jcr:content/body/help
  • information shown on the card view (dependent on console; for example sites):
    • /libs/wcm/core/content/sites/jcr:content/body/content/content/items/childpages

Code Samples

Various packages have been made available on Github. These provide code samples related to the tasks covered on this page.


aem-admin-extension-new-console is a sample package showing how to create a new AEM 6 console. This package provides a UI for managing Launches and adds a link in the navigation:

Code on GitHub

You can find the code of this page on GitHub


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:

Code on GitHub

You can find the code of this page on GitHub

Create a Custom Console

  1. You can create a custom console with related actions; for example, Launches:


    This involves:

    • creating the root space definition of your new console; for example:
      • /apps/<yourProject>/admin/ext/launches
    • this can contain (according to requirements):
      • the corresponding clientlibs for custom actions and less/css definitions
        • /apps/<yourProject>/admin/ext/launches/clientlibs
      • components that need to be redefined/adjusted; for example, the breadcrumbs, datasource and the launch
        • /apps/<yourProject>/admin/ext/launches/components
      • the Granite UI page resource:
        • /apps/<yourProject>/admin/ext/launches/content/jcr:content
          property: sling:resourceType
      • the page definition of the console
        • /apps/<yourProject>/admin/ext/launches/content/jcr:content/head
        • /apps/<yourProject>/admin/ext/launches/content/jcr:content/body

    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:
      • 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

Add New Navigation Option to Rail

  1. You can add a navigation entry in the rail (for example, a custom console such as Launches). 

    To do this, you create an overlay of:


    In the /apps overlay:


    Create the new nodes and properties:

    • Extend navigation:
      • /apps/cq/core/content/nav/launches
    • Specify location in the tree:
      • property: sling:orderBefore
    • To create the connection, the id property references (i.e. must be the same as) the currentID property for the appropriate console:
      • property: id
      • value: same as for your console (e.g. cq-launches)
        for example: the same value as the currentId property on:

Add New Action to the Toolbar

  1. You can build your own components and include the corresponding client libraries for custom actions. For example, a Promote to Twitter action at:


    This can then be connected to a toolbar item on your console:


    For example, in selection mode:


Restrict a Toolbar Action to a specific Group

  1. You can use a custom rendering condition to overlay the standard action and impose specific conditions that must be fulfilled before it is rendered.

    For example, create a component to control the renderconditions according to group:


  2. To apply these to the Create Site action on the Sites console:


    Create the overlay:


  3. Then add the rendercondition for the action:


    Using properties on this node you can define the groups allowed to perform the specific action; for example, administrators

Renaming a Rail Entry

  1. You can rename a navigation entry in the rail by overriding:


  2. Depending on how you want to configure your instance, you might want to consider the impact on:

    • The title as used in the toolbar:
    • The tab title in the window:
    • The entry in the breadcrumbs

Remove Access to Navigation Option on Rail

  1. Open the user and/or group management and select the user/group you want to restrict access for.


    Avoid assigning/restricting permissions on a user-by-user basis. It is recommended to use groups.

  2. Remove access permissions to the appropriate node(s) under /libs/cq/core/content/nav/sites. These correlate to the navigation options in the rail:

    • projects
    • sites
    • apps
    • publications
    • forms
    • assets
    • communities
    • commerce
    • tools