Control Panel in Joomla
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 top2. 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.
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:
| Position | What 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:
| Module | What 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 top4. 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:
- The
titleattribute from the component's<dashboards>manifest entry. - A language key built from the name, such as
COM_CONTENT_DASHBOARD_CONTENT_TITLE. - A generic cpanel key as a fallback.
- 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 top5. 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_joomlaupdatewhether a core update is available. - The extensions update icon asks
com_installerwhether 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:
| Plugin | What 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.
6. Customising Your Dashboard
6.1 Add a Module to the Home Dashboard
You have two easy routes:
- From the dashboard: click the "Add dashboard module" tile, pick a module type, and it is created in the correct position.
- From the module manager: go to
System → Manage → Site Modules, switch the filter to Administrator, create a module, and set its Position tocpanel(oriconfor 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:
- Go to
System → Manage → Site Modulesand switch the location to Administrator. - Create a Custom module and type your content.
- Set Position to
cpanel. - Set Access to a private group such as Manager or Super Users.
- Save. The box now appears on every administrator's home dashboard who is allowed to see it.
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:
| Table | Role 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.
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 top9. 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 top10. 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 top11. 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
cpanelandicon; component dashboards usecpanel-<name>andicon-<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.
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 top13. 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
dashboardURL 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

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


