Skip to main content
Debug in Joomla
On this page
# Topics

Debug in Joomla

30 June 2026

When a Joomla page shows a blank screen, a wrong translation, or simply loads too slowly, guessing is the slowest way to find the cause. Joomla has a built-in tool that turns guessing into reading: it shows you every database query, every loaded language file, the memory used, the time spent, and the warnings PHP would otherwise hide. It is called Debug Mode, and the engine behind it is the System - Debug plugin (plg_system_debug).

Most administrators meet Debug Mode as a single Yes/No switch in Global Configuration, and never look further. But that switch unlocks a whole diagnostic console at the bottom of every page, a set of options that decide what it shows, and a developer API for measuring your own code. Used well, it is the fastest way to understand what Joomla is really doing on each request.

The switch that makes Joomla explain itself - every query, every file, every millisecond, laid out at the bottom of the page.

This article explains how Joomla's Debug Mode really works. It covers the basics for owners and editors, the settings for administrators, and the technical details for developers: where the switch lives, how the plugin renders the console, who is allowed to see it, and why it must never stay on in production.

1. The Basics

1.1 What is Debug Mode?

Debug Mode is a state you turn on while you investigate a problem. With it off (the normal state for a live site), Joomla runs quietly and shows nothing extra. With it on, Joomla collects detailed information about how it built the page and prints it in a Debug Console - a dark bar pinned to the bottom of the screen, with tabs you can open.

There are two separate switches, and they do different jobs:

  • Debug System - the main switch. It shows queries, profiling, memory, the request data, loaded plugins, and PHP warnings.
  • Debug Language - a narrower switch for translators. It marks untranslated strings and lists which language files loaded.

1.2 The Two Pieces That Make It Work

Debug Mode only does something when two pieces agree:

  • The setting in Global Configuration (debug and debug_lang), which tells Joomla you want debugging.
  • The System - Debug plugin, which actually collects the data and draws the console.

If the setting is on but the plugin is disabled, nothing appears. If the plugin is enabled but the setting is off, the plugin does nothing. You need both. Section 3 explains the plugin in detail.

1.3 Why It Matters

Debug Mode answers the questions you cannot see from the outside:

  • Why is this page slow? The query and profile tabs show the slow part.
  • Why is my text not translated? The language tab marks the missing string.
  • Why did the page break? PHP notices and warnings, normally hidden, become visible.

It turns "something is wrong" into "this query takes 400 ms" or "this language key is missing". That is the difference between fixing a problem and guessing at it.

1.4 Where to Find It

The switches live in Global Configuration:

System -> Global Configuration -> System -> Debug Settings

The plugin lives in the plugin manager:

System -> Manage -> Plugins -> search "Debug" -> System - Debug

When both are on and you reload a frontend or backend page, the Debug Console appears at the bottom.

Back to top

2. Turning Debug On

2.1 The Debug Settings Tab

On System → Global Configuration → System you find the Debug Settings group with three fields:

FieldKeyDefaultWhat it does
Debug System debug No (0) Turns on the main Debug Console.
Debug Language debug_lang No (0) Marks translations and lists language files.
Debug Language Constants debug_lang_const Yes (1) Shows the constant name or its value for untranslated strings. Only visible when Debug Language is on.

Set Debug System to Yes, click Save, and reload a page. The console appears - provided the plugin is enabled and you are allowed to see it (section 6).

2.2 Error Reporting Goes With Debug

Debug Mode shows PHP warnings, but PHP only generates them if error reporting allows it. The related field sits one tab over, on System → Global Configuration → Server:

Error ReportingEffect
System Default Leaves it to the server's php.ini.
None Hides all PHP messages.
Simple Shows errors and warnings, hides notices.
Maximum Shows everything, including notices and deprecation messages.

When you are chasing a hard problem, set Error Reporting to Maximum together with Debug System. You then see every notice PHP can raise. Set it back to System Default (or None) before you go live, so visitors never see a raw PHP error.

2.3 What Happens the Moment Debug Turns On

Switching debug on changes more than the console. Joomla also:

  • defines the JDEBUG constant as true, which the whole CMS checks (section 7);
  • starts the application Profiler, so timing marks are recorded;
  • turns GZIP compression off for the request, so the console HTML is not compressed away.

This is why a debug page can look and behave slightly differently from a normal one. Debug Mode is a diagnostic state, not a transparent overlay.

Back to top

3. The System - Debug Plugin

3.1 The Plugin Does the Real Work

The setting is only a flag. The component that reads it and builds the console is the System - Debug plugin, plg_system_debug, in the system plugin group. It ships with Joomla and is enabled by default.

The plugin listens to several application events. The two that matter most are:

  • onAfterRespond - fires after Joomla has built the response. The plugin gathers all the collected data and injects the console just before </body>.
  • onBeforeCompileHead - adds the console's own CSS and JavaScript to the page head.

3.2 The First Thing the Plugin Checks

When the plugin loads, it immediately checks whether debugging is wanted at all:

// Skip the plugin entirely if both switches are off
if (!$debugLang && !$app->get('debug')) {
    return;
}

If neither Debug System nor Debug Language is on, the plugin does nothing and costs almost nothing. This is why leaving the plugin enabled on a live site is harmless on its own: without the setting, it never runs.

3.3 The DebugBar Library

The console you see is rendered by a well-known PHP library, PHP DebugBar, bundled with Joomla under media/vendor/debugbar/. Joomla feeds the library a set of data collectors - one per tab - and the library draws the bar and its panels. You do not edit this directly; you control it through the plugin options.

Back to top

4. Reading the Debug Console

Each tab in the console is filled by one data collector. Knowing what each one means turns the bar from noise into a map of the request.

TabCollectorWhat it tells you
Info InfoCollector Joomla version, PHP version, the request id, and a redaction note.
User UserCollector The current user and their groups.
Memory MemoryCollector Peak memory used to build the page.
Request RequestDataCollector GET, POST, cookie, and session-relevant request data.
Session SessionCollector The contents of the session store.
Profile ProfileCollector Time markers from boot to finish, the heart of speed analysis.
Queries QueryCollector Every database query, its time, and how often it ran.
Log MessagesCollector Log messages and deprecation warnings collected this request.
Language tabs Language*Collector Loaded language files, used strings, and translation errors.

4.1 The Queries Tab Is Where Speed Problems Hide

The Queries tab counts every query and shows its duration. Two patterns reveal trouble at a glance:

  • A high total count (hundreds of queries on one page) usually means an extension is querying inside a loop. This is the classic "N+1" problem.
  • One slow query standing out from the rest points to a missing index or a heavy join.

The same query repeated many times is also flagged, which quickly exposes code that asks the database for the same thing again and again instead of caching it.

As a loose rule of thumb, a normal Joomla page runs under about a hundred queries; a few hundred is a sign to investigate, and several hundred almost always means an extension is looping. These are not hard limits - a complex page legitimately needs more - but a sudden jump in the count is a reliable warning sign.

4.2 The Profile Tab Reads Like a Timeline

The Profile tab lists named marks from the start of the request to the end - "afterInitialise", "afterRoute", "afterDispatch", "afterRender", and more. The time between two marks tells you which phase is slow. A big jump before "afterRender" points at the template or modules; a jump around "afterDispatch" points at the component doing the work.

4.3 Query Traces: Find Out Who Fired a Query

Knowing a query is slow is only half the answer; you also need to know which extension issued it. Turn on the Query Traces option (section 5.1) and each query in the Queries tab gains a call stack - the chain of files and methods that led to it, for example a module helper calling loadObjectList(). This is what turns "120 identical category queries" into "this module is querying inside a loop", because the trace names the file and line responsible. It is the fastest way to pin a query on the extension that owns it.

Back to top

5. The Plugin Options

The plugin's Options (open the plugin and look at the tabs) decide exactly what the console shows. They are grouped into three fieldsets.

5.1 Basic: The Main Panels

OptionDefaultControls
Refresh Assets Yes Adds a fresh hash to every script and stylesheet on each reload, so the browser never serves a cached asset while you work.
Allowed Groups (empty) Which user groups may see the console. Empty means everyone (see section 6).
Memory, Request, Session, Profiling, Queries Show Turn the matching tab on or off.
Query Traces / Query Profiles / Query Explains Hide Extra per-query detail; only shown when Queries is on.
Track Request History Disabled Saves each request's data to disk for later inspection (see section 11).

5.2 Query Explains: Ask the Database to Explain Itself

With Query Explains on, Joomla runs an EXPLAIN on each select query (on MySQL and PostgreSQL) and shows the result in the Queries tab. This reveals whether the database used an index or scanned the whole table - the single most useful clue when a query is slow. Query Profiles goes further on MySQL, using SHOW PROFILE to break a query into stages, but it needs MySQL profiling enabled on the server.

5.3 Why Refresh Assets Matters During Development

Normally Joomla adds a version hash to CSS and JS so browsers can cache them safely. While you edit a template's CSS, that cache works against you - the browser keeps the old file. Refresh Assets changes the hash on every load so you always see your latest change. It is on by default precisely because debugging usually means editing front-end files.

Back to top

6. Controlling Who Sees Debug

6.1 The Allowed Groups Option

By default, when Debug System is on, everyone who visits the site sees the console - including anonymous visitors. That is fine on a local copy and dangerous on a public one. The Allowed Groups option (filter_groups) limits the console to chosen user groups.

The plugin checks it like this:

$filterGroups = (array) $this->params->get('filter_groups', []);

if (!empty($filterGroups)) {
    $userGroups = $user->groups;

    // Show debug only if the user is in one of the allowed groups
    if (!array_intersect($filterGroups, $userGroups)) {
        return false;   // not allowed - hide the console
    }
}

Set Allowed Groups to Super Users (or your developer group) so that even with debug left on by accident, normal visitors never see it.

6.2 Sensitive Values Are Redacted

The console can show request, session, and configuration data, some of which is sensitive. The plugin automatically redacts keys that look like secrets - passwords, tokens, and similar - before printing them. The match pattern covers names such as password, passwd, secret, token, and smtppass. This reduces the risk, but it is not a reason to relax: a console on a public site still leaks query structure, file paths, and version numbers that help an attacker.

Treat the Debug Console as internal information. Restrict it to a trusted group, and turn the setting off the moment you are done.

6.3 A Real Example: The 2022 Debug Disclosure

This is not a theoretical risk. I came across this myself in 2022, after one of my newly launched Joomla sites was compromised. During my investigation, I shared my findings and analysis with the Joomla Security Strike Team, who traced the issue to its root cause and implemented the fix released in Joomla 4.2.4.

Before Joomla 4.2.4, the debug output could expose sensitive request data, including a logged-in user's session and CSRF tokens, to people who were not meant to see it. An attacker who reads those tokens can hijack the session and act as that user. The Joomla project documented this as security advisory 20221001 (CVE-2022-27912), "Disclosure of critical information in Debug Mode". It affected Joomla 4.0.0 through 4.2.3 and was fixed in the Joomla 4.2.4 security release.

The fix is exactly the redaction described above: the PROTECTED_COLLECTOR_KEYS pattern was added in 4.2.4 so that password- and token-like values are masked before the console prints them. It is a sharp reminder that the safe state is not "redacted debug on a live site" but "debug off on a live site".

I wrote up how one of my own Joomla 4 sites was affected, and what I learned from it, in the Joomla Community Magazine: How my new Joomla 4 website got hacked.

Back to top

7. Under the Hood: JDEBUG and the Query Monitor

7.1 The JDEBUG Constant

The whole CMS keys off one constant. When Joomla boots, includes/framework.php reads the setting and defines it:

if (!defined('JDEBUG')) {
    define('JDEBUG', $config->debug);
}

From then on, any code can ask whether debugging is on with a single, cheap check:

if (JDEBUG) {
    // Do extra diagnostic work only in debug mode
}

Core uses this to start the profiler, keep extra timing, and avoid that work entirely when debug is off. Your own extension can use the same constant to add temporary diagnostics that cost nothing in production.

7.2 Where the Setting Is Stored

The two switches are ordinary Global Configuration values, so they live in configuration.php in the site root, not in the database:

public $debug = '0';        // Debug System
public $debug_lang = '0';   // Debug Language
public $error_reporting = 'default';

This matters when the backend is unreachable. If a change has locked you out and debug is stuck on, you can edit this file directly and set public $debug = '0'; to turn the console off without logging in.

7.3 The Query Monitor

The Queries tab is fed by a database monitor. When debug is on, Joomla's database driver keeps a monitor that records every query, its bound parameters, and how long it took. The plugin reads this monitor at the end of the request to build the Queries tab. If you turn the Queries panel off, the plugin removes the monitor entirely, so the request stops paying the cost of recording queries.

7.4 The Events the Plugin Listens To

EventWhy the plugin uses it
onAfterRespond Collect all data and inject the console into the HTML.
onBeforeCompileHead Add the console's CSS and JS, and optionally clear asset versions.
onBeforeRespond Add a Server-Timing header from the profiler marks.
onAfterDisconnect Run EXPLAIN and profile queries after the database disconnects.
onAjaxDebug Serve stored request history over AJAX (section 11).
Back to top

8. Profiling Your Own Code

8.1 Adding Your Own Time Marks

The Profile tab is not limited to core marks. Any code can add its own using the application Profiler. Each mark records the time and memory since the request started:

use Joomla\CMS\Profiler\Profiler;

$profiler = Profiler::getInstance('Application');

$profiler->mark('myExtension: before heavy work');
$result = $this->doHeavyWork();
$profiler->mark('myExtension: after heavy work');

Both marks appear in the Profile tab, and the gap between them is exactly how long your heavy work took. This is the simplest way to measure a suspected slow method without an external profiler.

8.2 The Server-Timing Header

When profiling is on, the plugin also writes the marks into a standard Server-Timing response header. Your browser's developer tools (the Network tab) then show the same timings on the request, so you can read them without opening the console. Module render time and access-check time are summed into their own entries, which makes a slow template easy to spot.

8.3 Use the Constant to Guard Expensive Diagnostics

If your diagnostic itself is costly - dumping a large array, building a trace - wrap it in the constant so it never runs in production:

if (JDEBUG) {
    Log::add('Payload: ' . print_r($payload, true), Log::DEBUG, 'my-extension');
}

This keeps the live site fast while giving you full detail the moment you switch debug on.

8.4 When to Reach for Xdebug or a Profiler

The Debug Console is a fast first layer: it tells you where the problem is - a slow query, a heavy plugin, a slow phase of the request. To find the exact line of PHP behind that, reach for a step debugger such as Xdebug, or a code profiler such as Blackfire or Tideways. The workflow is to let Joomla's Debug point at the suspect component or query, then use the external tool to drill into the method that causes it. The two layers complement each other; neither replaces the other.

Back to top

9. Logging and Deprecation Warnings

9.1 The Log Tab

With the Log option on (the default), the console gathers messages written through Joomla's logging system during the request and shows them in a Log tab, coloured by severity. This is where your own Log::add() calls appear, alongside core notices. It saves you from opening a log file to see what happened on a single page load.

9.2 Deprecation Warnings

Joomla warns when code uses an old API that will be removed in a future version. Two settings work together:

SettingWhereEffect
Log Deprecated API Global Configuration (log_deprecated) Records deprecation warnings at all.
Split Deprecated Core API Plugin options (log-deprecated-core) Separates warnings caused by Joomla core from those caused by extensions.

The split is useful because it answers the key question: is the deprecated call my extension's fault, or core's? Warnings from /libraries/src are grouped as "core", the rest as your own code. Fix the ones in your code; the core ones will be handled by Joomla updates.

9.3 Why This Helps Before an Upgrade

Turn on Log Deprecated API and browse your site in debug before a major Joomla upgrade. Every deprecation warning is a piece of code that may stop working in the next version. Fixing them now, while the old API still works, is far easier than fixing a broken site later.

Back to top

10. Language Debugging

10.1 What Debug Language Shows

Set Debug Language to Yes and Joomla marks translated text on the page so you can see the state of each string. Untranslated strings stand out, and the console gains language tabs that list:

  • Language files - every .ini file Joomla loaded for this page.
  • Language strings - the keys that were used.
  • Language errors - keys that had no translation, or files with syntax errors.

This is the fastest way to find a missing translation: the bad key shows on the page, and the language tab tells you which file should contain it.

10.2 The Marker Characters

Translated strings are wrapped in marker characters on screen. A string with markers on both sides was translated cleanly; a string shown as its raw constant name (like COM_EXAMPLE_HELLO) has no translation at all. The Debug Language Constants option decides whether you see the constant name or its fallback value for such strings.

10.3 Stripping Long Prefixes

Joomla language keys can be long. The language fieldset of the plugin options lets you strip a common prefix or suffix from the displayed key, and the Strip First Word option removes the leading part (often the extension name). These only change how keys are shown in the console; they do not touch your translation files.

Back to top

11. Debug, AJAX, and Request History

11.1 One Console Per Request

The Debug Console normally shows the request that drew the page. But many actions happen over AJAX, after the page has loaded, and those requests have no console of their own. The Track Request History option solves this by saving each request's debug data so you can open it later.

11.2 How It Works

With the option on, the plugin writes each request's collected data to a file under the cache folder:

cache/plg_system_debug_site/        (or _administrator)

The console then offers an "open handler" that fetches a past request over AJAX (index.php?option=com_ajax&plugin=debug&group=system) and shows its data. This lets you inspect the queries and profile of a background AJAX call that never had a visible bar.

11.3 A Serious Security Warning

This feature stores raw request data, and that data can include passwords and secret tokens in files that anyone with read access to the cache folder can open. Joomla's own help text is blunt about it: enable it only briefly, and when you turn it off again, clear the site cache so the stored files are removed. Never leave Track Request History on.

Back to top

12. Web Services and the Command Line

12.1 JDEBUG Exists Everywhere

The JDEBUG constant is defined in every entry point - the site, the administrator, the API application, and the CLI. The same debug setting therefore affects them all. On the command line, Joomla's console even reports the debug state in its version line:

php cli/joomla.php --version
Joomla! 6.x.x (debug: No)

12.2 No Debug Console in JSON Responses

The Debug Console is HTML, injected before </body>. A Web Services request returns JSON, which has no body tag, so the plugin does not inject a console into API responses - it would corrupt the JSON. Instead, when data is collected for a non-HTML response, the plugin stacks it internally rather than printing it. In practice this means you debug the REST API through logs and the query monitor, not through a visible bar.

12.3 No REST Endpoint for Debug

There is no /api/index.php/v1/ route to turn debugging on or off. Debug is a configuration and diagnostic concern, not data to expose over an API. To change it from automation, edit the setting through the backend or, in a controlled deployment, the debug value in configuration.php.

12.4 No Console in Scheduled Tasks or CLI

The Debug Console only exists for an HTML page request. Joomla's Scheduled Tasks and CLI commands run with no browser response, so there is no bar to read - even with debug on. When you need to diagnose a task or a console command, fall back on the tools that do not need a page: write to the log with Log::add(), add Profiler::mark() calls to measure timing, and make sure exceptions are caught and logged. The same is true for any background work that never renders HTML.

Back to top

13. SEO and Performance

Debug Mode has no direct SEO feature, but leaving it in the wrong state has very real SEO and performance costs.

13.1 Debug On in Production Is a Performance Bug

When debug is on, Joomla records every query, keeps extra profiling data, turns off GZIP compression, and appends fresh hashes to assets so the browser cannot cache them. Every one of these makes pages slower and heavier. A live site running with debug on is measurably slower for every visitor and every crawler, which hurts Core Web Vitals and, indirectly, ranking.

13.2 The Console Can Reach Crawlers

If Allowed Groups is empty and debug is on, the console is added to the HTML that search engines crawl. That is extra markup on every page and, worse, an information leak of paths and versions. Restricting the console to a trusted group keeps it out of the public page entirely.

13.3 Use Debug to Improve Performance, Then Turn It Off

The right way to use Debug Mode for SEO is indirect: turn it on, read the Queries and Profile tabs, fix the slow query or the heavy template, and turn it off. The console is a tool for finding speed problems, not something that belongs on a live page.

Back to top

14. Common Mistakes and Pitfalls

14.1 Debug Is On but Nothing Appears

Symptom: You set Debug System to Yes but no console shows at the bottom of the page.

Fix: Check the plugin. The System - Debug plugin must be enabled under System → Manage → Plugins. Also check Allowed Groups - if it lists a group you are not in, the console is hidden from you.

14.2 The Console Shows on the Live Site for Everyone

Symptom: Visitors report a strange dark bar with technical data at the bottom of the page.

Fix: Debug is on in production with Allowed Groups empty. Turn Debug System off in Global Configuration. As a safety net, set Allowed Groups to Super Users so this cannot happen again.

14.3 The Site Is Slow After "Fixing" Something

Symptom: The whole site feels slower than before, with no obvious cause.

Fix: Check whether debug was left on. Debug Mode disables GZIP and asset caching and records every query. Set debug back to No and the speed returns.

14.4 A White Page With No Error

Symptom: A page is blank and you cannot tell why.

Fix: Turn on Debug System and set Error Reporting to Maximum. The hidden PHP error that caused the blank page now appears, pointing at the file and line.

14.5 Passwords Visible in the Request Tab

Symptom: You worry the console is showing a login password.

Fix: The plugin redacts keys that look like secrets, but the safest answer is to never run the console where untrusted people can see it. Restrict Allowed Groups, and never enable Track Request History except for a short, supervised test.

14.6 Translations Look Fine With Debug Off but Broken With It On

Symptom: Text shows odd marker characters around it.

Fix: That is Debug Language doing its job - the markers are how it shows translation state. Turn Debug Language off and the markers disappear; they are never shown to normal visitors.

Back to top

15. Best Practices

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

  • Use Debug Mode to diagnose, then turn it off. It never belongs on a live site for long.
  • Set Allowed Groups to Super Users (or your developer group) so the console is never shown to visitors, even by accident.
  • Pair Debug System with Error Reporting: Maximum when chasing a blank page or a hidden warning.
  • Read the Queries tab for query count and slow queries; turn on Query Explains to see missing indexes.
  • Use the Profile tab and your own Profiler::mark() calls to find the slow phase of a request.
  • Turn on Log Deprecated API before a major upgrade and fix your extension's warnings.
  • Never leave Track Request History on; it can store passwords on disk. Clear the cache after using it.
  • Keep the System - Debug plugin enabled - it is free when the setting is off - but control everything through the debug switch.
Back to top

16. Quick Reference

TURN ON SYSTEM DEBUG   System -> Global Configuration -> System -> Debug Settings -> Debug System = Yes
TURN ON LANG DEBUG     same tab -> Debug Language = Yes
ERROR REPORTING        System -> Global Configuration -> Server -> Error Reporting = Maximum
THE PLUGIN             System -> Manage -> Plugins -> System - Debug
RESTRICT WHO SEES IT   System - Debug plugin -> Options -> Allowed Groups = Super Users

SETTINGS (configuration.php)
  debug             0 off / 1 on   (defines JDEBUG)
  debug_lang        0 off / 1 on
  error_reporting   default / none / simple / maximum
  log_deprecated    log deprecated API calls

CONSOLE TABS
  Info Profile Queries Memory Request Session User Log  + Language tabs

KEY PLUGIN OPTIONS
  filter_groups          who may see the console (empty = everyone)
  queries                show the Queries tab
  query_traces           add a call stack to each query (names the culprit)
  query_explains         run EXPLAIN on select queries
  refresh_assets         break asset cache each reload
  log-deprecated-core    split core vs extension deprecations
  track_request_history  save requests to disk (RISKY - off)

CODE
  Is debug on?     if (JDEBUG) { ... }
  Add a time mark  Profiler::getInstance('Application')->mark('label')
  Guarded log      if (JDEBUG) Log::add($msg, Log::DEBUG, 'my-ext')

CLI
  Show debug state php cli/joomla.php --version   ->  (debug: No)
Back to top

17. Summary

Joomla's Debug Mode is the built-in way to make the CMS explain what it is doing:

  • Two switches in Global Configuration - Debug System (debug) and Debug Language (debug_lang) - turn it on.
  • The System - Debug plugin reads those switches and renders the Debug Console with one tab per data collector: queries, profile, memory, request, session, log, and language.
  • The JDEBUG constant carries the state into every part of the CMS, so core and your own code can do extra work only when debugging.
  • Allowed Groups keeps the console away from visitors; sensitive keys are redacted, but the console is still internal information.
  • Developers profile their own code with Profiler::mark(), read query plans with Query Explains, and prepare for upgrades with deprecation logging.
  • Debug Mode disables GZIP and asset caching, so it slows the site and must never stay on in production.

Once you see Debug Mode as a diagnostic state rather than a single button, the console stops being a wall of numbers and becomes a clear report: this many queries, this much time here, this string untranslated, this API deprecated. If your site is slow, blank, or showing the wrong text, turning on debug for a few minutes is almost always the quickest path to the real cause - and knowing how to read what it tells you is one of the skills that separates guessing from genuine Joomla troubleshooting.

Back to top
Debug in Joomla
Peter Martin
Peter Martin
Joomla Specialist

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