Skip to main content

Control Panel in Joomla

19 June 2026

Every time you log in to the Joomla backend, you land on the same screen: a grid of tiles, quick icons, and small information boxes. That screen is not magic and it is not part of the template. It is a real component called com_cpanel.

This article explains how the Joomla Control Panel really works. It covers the basics for owners and editors, the daily setup for administrators, and the technical details for developers. You will learn what the cpanel is, how its tiles are actually modules, how the dashboard system lets every component have its own home screen, and how the component is wired into Joomla 6.

The dashboard you land on is not a fixed page. It is a module position you can rearrange.

The goal is simple: help you understand the Control Panel well enough to customise it with confidence and stop treating it as a black box.

1. The Basics

1.1 What is the Control Panel?

The Control Panel (often shortened to "cpanel") is the home screen of the Joomla administrator. It is the first page you see after you log in to /administrator/. In Joomla it is delivered by a small core component named com_cpanel.

Do not confuse it with the hosting tool also called "cPanel". They share a name but have nothing to do with each other. Joomla's com_cpanel is purely the admin dashboard inside your Joomla site.

1.2 What You See on the Screen

A default Control Panel is made of three kinds of blocks:

  • Quick Icons: the big shortcut buttons (New Article, System, Manage Extensions, and the update notices).
  • Information modules: boxes such as Logged-in Users, Popular Articles, Recently Added Articles, and the Joomla notification panel.
  • An "Add module" tile: a button that lets you drop a new module straight onto the dashboard.

The key idea to remember from the start is this:

The Control Panel is not a hard-coded page. Almost everything on it is a module published to a special module position.

1.3 Why This Matters

Because the dashboard is built from modules, you can change it without touching any code. You can add a box, remove a box, reorder boxes, or restrict a box to one user group. Most administrators never realise this and live with the default layout for years.

1.4 Where to Find It

You reach the Control Panel in three ways:

  • Log in to the backend; you arrive there automatically.
  • Click the Home Dashboard link in the top-left of the admin menu.
  • Open the URL directly:
/administrator/index.php?option=com_cpanel&view=cpanel
Back to top

2. Where com_cpanel Lives

2.1 A Backend-only Component

The component exists only on the administrator side. There is no front-end folder, because visitors never see a control panel:

public_html/administrator/components/com_cpanel/
├─ services/          (DI container wiring)
├─ src/               (PHP classes, PSR-4)
├─ tmpl/              (the dashboard layout)
└─ cpanel.xml         (manifest)

Notice what is missing: no sql/ folder and no front-end components/com_cpanel/. The cpanel stores no data of its own. It only gathers and shows modules that already exist.

2.2 The Manifest

The manifest cpanel.xml is short and tells the whole story:

<extension type="component" method="upgrade">
    <name>com_cpanel</name>
    <version>4.0.0</version>
    <namespace path="src">Joomla\Component\Cpanel</namespace>
    <administration>
        <files folder="admin">
            <filename>cpanel.xml</filename>
            <folder>services</folder>
            <folder>src</folder>
            <folder>tmpl</folder>
        </files>
        <languages folder="admin">...</languages>
    </administration>
</extension>

There is an <administration> block but no top-level <files> block for the site. That confirms it: com_cpanel is an admin-only component.

2.3 The Single View

The component has exactly one view, called cpanel. There is no list view, no edit form, and no toolbar full of publish or trash buttons. The whole component does one job: render the dashboard for the current request.

Back to top

3. The Tiles Are Modules

3.1 Module Positions, Not Page Sections

On the front-end you already know that a template has module positions such as sidebar-right or footer. The administrator template works the same way, and the Control Panel reads from its own admin positions.

The default Home Dashboard reads modules from these positions:

PositionWhat it holds
cpanel The standard dashboard information modules
icon The Quick Icon modules (the big shortcut buttons)

When you open a component-specific dashboard, the positions change to a per-dashboard name, as the next section explains.

3.2 The Modules You Get by Default

A fresh Joomla install ships several admin modules already published to the dashboard:

ModuleWhat it shows
mod_quickicon Shortcut buttons and update warnings
mod_latestactions Recent user actions from the action log
mod_logged Currently logged-in users
mod_popular Most-viewed articles
mod_latest Recently added articles
mod_privacy_dashboard Privacy request summary
mod_messages Private messages between admins

Every one of these is an ordinary administrator module. You manage them in System → Manage → Site Modules, after switching the location filter to Administrator.

3.3 The "Add Module" Tile

The last tile on the dashboard is a button labelled "Add dashboard module". It only appears for users who may create modules. Clicking it opens a modal that pre-filters the module list to the current dashboard position, so the module you create is published to the right place automatically.

Back to top

4. Dashboards: One per Component

4.1 The Big Idea

Since Joomla 4, the cpanel is not just one screen. It is a dashboard engine. Each major component can have its own dashboard, and they all run through the same com_cpanel view. The Content menu, for example, has a "Content Dashboard" that is really com_cpanel showing a different set of module positions.

4.2 How a Dashboard Is Requested

A dashboard is selected with a single URL parameter named dashboard:

/administrator/index.php?option=com_cpanel&view=cpanel&dashboard=content
/administrator/index.php?option=com_cpanel&view=cpanel&dashboard=system
/administrator/index.php?option=com_cpanel&view=cpanel&dashboard=help

The view turns that value into a module position. The home screen (no dashboard value) uses cpanel and icon. A named dashboard uses prefixed positions instead:

dashboard=content
   → information modules from position   cpanel-content
   → quick icon modules from position    icon-content

So a "Content Dashboard" is simply the same component rendering whatever modules you published to the cpanel-content and icon-content positions.

4.3 Declaring a Dashboard in a Manifest

A component announces its dashboard in its install manifest with a <dashboards> block. This is the real entry from com_content:

<dashboards>
    <dashboard title="COM_CONTENT_DASHBOARD_TITLE"
               icon="icon-file-alt">content</dashboard>
</dashboards>

The text inside the tag (content) is the dashboard name used in the URL. The title and icon attributes give the page its heading and icon. In Joomla 6 core, the components that ship a dashboard are com_content, com_menus, com_users, and com_privacy.

4.4 How the Title Is Built

When you open a dashboard, the view tries several sources for the heading, in order:

  1. The title attribute from the component's <dashboards> manifest entry.
  2. A language key built from the name, such as COM_CONTENT_DASHBOARD_CONTENT_TITLE.
  3. A generic cpanel key as a fallback.
  4. Finally, the base title COM_CPANEL_DASHBOARD_BASE_TITLE.

The icon follows the same idea. This graceful fallback means a dashboard still renders a sensible heading even if a translation is missing.

Back to top

5. Quick Icon Modules

5.1 What They Are

The big shortcut buttons at the top of the dashboard come from mod_quickicon. Each quick icon module renders a group of buttons. A button can be a simple link, or it can call a small AJAX service that checks something in the background.

5.2 The Update Checks Are Quick Icons

The "Joomla is up to date" and "Extensions are up to date" notices you see on the dashboard are quick icons that call AJAX endpoints. They fire after the page loads, so a slow update server never blocks your dashboard:

  • The Joomla update icon asks com_joomlaupdate whether a core update is available.
  • The extensions update icon asks com_installer whether any extension update is available.

This is why the update badges sometimes appear a second after the rest of the page. They are loaded asynchronously on purpose.

5.3 The context Parameter

A quick icon module has a context parameter. The context decides which set of buttons the module shows and, in the cpanel layout, becomes a CSS class (quickicons-for-<context>). Plugins of the type quickicon listen for a matching event and add their buttons to the right context. That is how an extension can add its own button to your dashboard without editing the cpanel at all.

5.4 The onGetIcons Event

The module does not hard-code its buttons. It dispatches the onGetIcons event (a QuickIconsEvent), and every quickicon plugin that subscribes returns the buttons it wants to show:

// Inside a quickicon plugin
public static function getSubscribedEvents(): array
{
    return ['onGetIcons' => 'getCoreUpdateNotification'];
}

Joomla 6 ships eight core quickicon plugins, each contributing to this event:

PluginWhat its button reports
joomlaupdate A pending Joomla core update
extensionupdate Pending extension updates
autoupdate Automatic update readiness
phpversioncheck An outdated or unsupported PHP version
overridecheck Template overrides affected by an update
downloadkey Missing download keys for paid extensions
privacycheck Outstanding privacy requests
eos End-of-support reminders for the Joomla version

This is textbook decoupling: the module asks "who has icons for me?" and the plugins answer. To add your own button, you write a quickicon plugin that subscribes to onGetIcons - you never touch com_cpanel or mod_quickicon.

Back to top

6. Customising Your Dashboard

6.1 Add a Module to the Home Dashboard

You have two easy routes:

  1. From the dashboard: click the "Add dashboard module" tile, pick a module type, and it is created in the correct position.
  2. From the module manager: go to System → Manage → Site Modules, switch the filter to Administrator, create a module, and set its Position to cpanel (or icon for a quick icon).

6.2 Reorder, Hide, or Restrict Tiles

Because the tiles are modules, every module setting applies:

  • Ordering: change the module order to move a tile up or down.
  • Access: set the module's Access level so only certain admin groups see it.
  • Status: unpublish a module to remove a tile without deleting it.

6.3 Put a Module on a Component Dashboard

To add a box to the Content Dashboard rather than the home screen, set the module position to cpanel-content (information module) or icon-content (quick icon). The same pattern works for any component that declares a dashboard: use the prefix plus the dashboard name.

6.4 A Practical Example

Suppose you want a custom HTML box with internal phone numbers on the home dashboard:

  1. Go to System → Manage → Site Modules and switch the location to Administrator.
  2. Create a Custom module and type your content.
  3. Set Position to cpanel.
  4. Set Access to a private group such as Manager or Super Users.
  5. Save. The box now appears on every administrator's home dashboard who is allowed to see it.
Back to top

7. Under the Hood (Developer View)

7.1 The Request Flow

The cpanel uses the standard modern component flow, but its model is unusually thin because it has no data of its own:

URL: /administrator/index.php?option=com_cpanel&view=cpanel&dashboard=content
                |
                v
   services/provider.php   (DI: MVCFactory + Dispatcher)
                |
                v
   Dispatcher::checkAccess()   (empty override, no ACL block)
                |
                v
   DisplayController::display()   (forces tmpl=cpanel)
                |
                v
   View\Cpanel\HtmlView::display()
   (resolve dashboard → positions, load modules, build title)
                |
                v
   tmpl/cpanel/default.php   (render each module with ModuleHelper)

7.2 The Controller Forces a Template

The controller does one notable thing. It sets the template style to cpanel so the admin template knows to render the dashboard chrome:

public function display($cachable = false, $urlparams = [])
{
    // Display cpanel.php from the selected admin template
    $this->input->set('tmpl', 'cpanel');

    return parent::display($cachable, $urlparams);
}

7.3 The View Resolves the Dashboard

The real work happens in HtmlView::display(). It reads the dashboard input, makes it URL-safe, then loads modules for the matching positions:

$dashboard = $app->getInput()->getCmd('dashboard', '');
$position  = OutputFilter::stringURLSafe($dashboard);

// Information modules and quick icons for this dashboard
$this->position   = $position ? 'cpanel-' . $position : 'cpanel';
$this->modules    = ModuleHelper::getModules($this->position);

$quickicons       = $position ? 'icon-' . $position : 'icon';
$this->quickicons = ModuleHelper::getModules($quickicons);

That is the whole secret of the dashboard system: a dashboard name becomes a module position, and ModuleHelper::getModules() returns whatever is published there.

7.4 The Layout Renders Modules

The template tmpl/cpanel/default.php simply loops over the two collections and renders each module with the well style:

foreach ($this->quickicons as $iconmodule) {
    echo ModuleHelper::renderModule($iconmodule, ['style' => 'well']);
}

foreach ($this->modules as $module) {
    echo ModuleHelper::renderModule($module, ['style' => 'well']);
}

The cpanel never knows or cares what a module does. It only renders whatever lives in the position.

7.5 The addModule Task

The "Add dashboard module" button calls the controller's addModule task. This task does not create a module itself. It sets a few user-state values so the module manager opens pre-filtered to the right client and position, then redirects to the module-selection modal:

$this->app->setUserState(
    'com_modules.modules.' . $clientId . '.filter.position',
    $position
);
$this->setRedirect(
    Route::_('index.php?option=com_modules&view=select'
           . '&tmpl=component&layout=modal', false)
);

It is a small convenience wrapper around the normal module workflow, nothing more.

7.6 Where the Dashboard Stores Its Modules

The cpanel has no tables of its own, but it reads from the same module tables the rest of Joomla uses. The difference is the client:

TableRole for the dashboard
#__modules One row per dashboard tile. Administrator modules have client_id = 1; the position column holds cpanel, icon, or a per-dashboard position such as cpanel-content.
#__modules_menu Assigns the module so it is allowed to display. A dashboard module typically uses the "all pages" assignment (menuid = 0).
#__extensions Where the quick icons read update and version metadata for their checks.

So a query like the following lists every tile on the Home Dashboard:

SELECT title, module, position, published, access
  FROM #__modules
 WHERE client_id = 1
   AND position IN ('cpanel', 'icon')
 ORDER BY position, ordering;

This confirms the central idea once more: configuring the dashboard means editing module rows, never the component.

7.7 Performance Notes

The dashboard renders every module in its positions on each backend login, so it is a good place to keep lean:

  • Too many modules: each tile is a full module render. A crowded dashboard slows down the first screen everyone sees.
  • Synchronous external calls: a custom quick icon that calls a remote API in PHP blocks the whole page. The core update icons avoid this by running over AJAX after load - follow the same pattern.
  • Expensive list modules: boxes like Popular Articles run database queries. Cache them, or limit how many items they fetch, on busy sites.
Back to top

8. Access Control: The Empty checkAccess

8.1 The Dispatcher Override

The cpanel Dispatcher contains the same intentional trick that com_admin uses. It overrides checkAccess() with an empty body:

class Dispatcher extends ComponentDispatcher
{
    protected function checkAccess()
    {
    }
}

The component-level ACL gate is deliberately removed. The reason is practical: every authenticated administrator must be able to reach a home screen, even one with a misconfigured permission set. If the cpanel enforced core.manage, a single bad ACL change could lock everyone out of the backend with no way back in.

8.2 Where the Real Access Checks Live

Removing the gate does not make the dashboard a security hole. Access is enforced one layer down:

  • You must already be a logged-in backend user to reach /administrator/ at all.
  • Each module on the dashboard has its own Access level, so a viewer only sees the boxes they are allowed to see.
  • Each quick icon links to a component that runs its own permission checks when you click it.

In other words, the cpanel shows you a frame, but every tile inside the frame still respects ACL.

Back to top

9. SEO and Metadata

The Control Panel is a backend-only screen, so classic SEO does not apply to it. There are no public URLs, no sitemaps, and no metadata for search engines. Robots never reach /administrator/ on a well-configured site.

There is one related point worth making. The dashboard is where Joomla surfaces the update notices that keep your site healthy, and a healthy, up-to-date site is the foundation of good SEO. If your quick icons report a pending core or extension update, applying it promptly protects both security and search ranking. So the cpanel supports SEO indirectly, by nudging you to keep the site current.

Back to top

10. Common Mistakes and Pitfalls

10.1 Confusing It with Hosting cPanel

Symptom: someone asks for the "cPanel login" and is sent to the Joomla backend, or the other way round.

Fix: be clear about which one you mean. Joomla's Control Panel is at /administrator/. Hosting cPanel is a separate server tool, usually on a different port and domain.

10.2 Looking for the Module in the Wrong List

Symptom: you cannot find the dashboard modules in the module manager.

Fix: dashboard modules are administrator modules, not site modules. In System → Manage → Site Modules, switch the location filter to Administrator before you search.

10.3 Publishing to the Wrong Position

Symptom: you create a module for the dashboard but it never appears.

Fix: check the position. The home dashboard reads cpanel and icon. A component dashboard reads cpanel-<name> and icon-<name>. A typo in the position name means an empty tile slot.

10.4 Editing the cpanel Files Directly

Symptom: you change tmpl/cpanel/default.php to alter the dashboard, and the change disappears after an update.

Fix: do not edit core files. Customise the dashboard with modules and their settings, or use a template override in the administrator template if you must change the layout itself.

10.5 Expecting the cpanel to Store Settings

Symptom: you look for cpanel "Options" to configure the dashboard and find almost nothing.

Fix: the cpanel has no meaningful settings of its own. The dashboard is configured entirely through the modules published to it. Configure the modules, not the component.

Back to top

11. Best Practices

If you remember only a few things from this article, remember these:

  • The Control Panel is built from modules; change it by managing modules, not code.
  • Dashboard modules are administrator modules; switch the location filter to find them.
  • The home dashboard uses positions cpanel and icon; component dashboards use cpanel-<name> and icon-<name>.
  • Use the Access level on each module to control who sees which tile.
  • Act on the update quick icons promptly; they exist to keep your site safe.
  • Never edit the cpanel core files; use module settings or a template override.
Back to top

12. Quick Reference

OPEN HOME       /administrator/index.php?option=com_cpanel&view=cpanel
OPEN DASHBOARD  ...&view=cpanel&dashboard=content
HOME POSITIONS  cpanel         (info modules)
                icon           (quick icons)
NAMED POSITIONS cpanel-<name>  (info modules)
                icon-<name>    (quick icons)
MANAGE MODULES  System → Manage → Site Modules (set location = Administrator)
DECLARE DASH    <dashboards><dashboard title="..." icon="...">name</dashboard>
COMPONENT       administrator/components/com_cpanel/
VIEW            src/View/Cpanel/HtmlView.php   (resolves dashboard to positions)
DISPATCHER      src/Dispatcher/Dispatcher.php  (empty checkAccess)
QUICK ICONS     mod_quickicon + quickicon plugins (context parameter)
STORES DATA     none - it only renders existing modules
Back to top

13. Summary

The Joomla Control Panel looks like a simple welcome page, but it is a flexible dashboard engine hiding in plain sight:

  • It is delivered by the admin-only component com_cpanel, which stores no data of its own.
  • Its tiles are ordinary modules published to special administrator positions.
  • A dashboard URL parameter turns into a module position, so every component can have its own home screen.
  • Quick icons add shortcuts and run the asynchronous update checks.
  • An empty checkAccess() guarantees you always have a way into the backend, while each module and link still respects ACL.

Once you see the dashboard as a set of module positions, you can shape it to fit how your team actually works: surface the boxes that matter, hide the ones that do not, and give each user group the home screen it needs.

If your backend feels cluttered, slow, or unhelpful when your team logs in, it is usually a sign that the dashboard was never tuned for the way you work. A well-organised Control Panel is a small change that quietly saves time every single day, and getting it right is exactly the kind of detail a Joomla specialist looks at first.

Back to top
Control Panel in Joomla
Peter Martin
Peter Martin

Joomla specialist and Linux admin for fast, secure and scalable websites.