Joomla® — The Flexible Platform Empowering Website Creators
Joomla! is an award-winning content management system (CMS), which enables you to build web sites and powerful online applications.
Multizone have been building websites and content management solutions with Joomla since its inception in 2005 and love it. it may not have the market share of some of the competition, but it is award-winning, free and open-source.
Joomla! has a global community of developers and volunteers, who make sure the platform is user friendly, extendable, multilingual, accessible, responsive, search engine optimized and more.
How to get started with Joomla!
Joomla! is free, open, and available to anyone under the GPL. If you are unfamiliar with this license, you might want to read the GNU General Public License FAQ. Read Getting Started with Joomla! to find out the basics.
If you're ready to install Joomla! by yourself ou can download the latest version of Joomla! and you'll be up and running in no time.
Joomla tech notes and demos
A PHP version bump in cPanel quietly switched display_errors back on for a live Joomla site, even though every config file I could see said it was off. Here's what happened and how to stop it happening to you.
The symptom
After moving the site to PHP 8.5 in cPanel's PHP Selector, PHP warnings and deprecation notices started appearing in the browser. That's bad: it leaks file paths and internals to visitors, and it looks awful.
The odd part was that nothing had been changed to turn errors on. The .user.ini and php.ini in the web root both contained display_errors = Off, and Joomla's own Error Reporting setting was set to None.
The gotcha
On CloudLinux hosting, PHP Selector doesn't use the php.ini or .user.ini in your web root at all. Each PHP version loads its own global php.ini plus a small per-account options file, and that's it.
The 8.5 build on my host has no display_errors line in its global php.ini. When the directive is missing, PHP falls back to its compiled-in default, which is On. Any override you had set in the Options tab for the previous version doesn't carry across, because those options are stored per version. So the moment the version changed, errors went live.
<?php
header('Content-Type: text/plain');
echo 'display_errors=', var_export(ini_get('display_errors'), true), "\n";
echo 'loaded=', php_ini_loaded_file(), "\n";
echo 'scanned=', php_ini_scanned_files(), "\n";
Drop that in the web root, load it in a browser, then delete it. The loaded and scanned lines tell you which ini files are really in play. In my case neither was in the web root.
The fix
Two places, and I'd suggest you do both.
- PHP Selector, Options tab. Set
display_errorsto Off andlog_errorsto On for the version you're running. Remember to do it again whenever you change version. .htaccessin the web root. LiteSpeed honoursphp_flagandphp_value, and this survives a version switch:
php_flag display_errors Off
php_flag display_startup_errors Off
php_flag log_errors On
php_value error_log /home/youraccount/public_html/error_log
Re-run the probe afterwards to confirm, then remove it.
Takeaway
Changing PHP version on a PHP Selector host resets more than you'd expect. After any switch, check the effective values rather than the config files, and keep a belt-and-braces override in .htaccess so the next upgrade can't surprise you.
- Details
I build and maintain Joomla sites. Earlier this year I took on the migration of a members' organisation's WordPress site: old hosting, an ageing PHP version, and a custom theme written in 2012 that nobody had touched in a decade. It is live now, on current WordPress and PHP, and the whole thing took days rather than weeks.
TL;DR – What surprised me was where the difficulty actually sat. I was never unclear about what I wanted. I could describe every outcome precisely. What I could not do was name the thing I was looking for, or guess where WordPress had put it. That gap turned out to be the whole job.
- Details
Read more: What a Joomla developer learned modernising a WordPress site
If you sign your extension’s subscription-validation responses with an RSA key, that private key is the root of trust for every copy you’ve ever shipped. So what do you do when it might have been exfiltrated? You can’t just mint a new one and swap it in — the instant you do, every customer’s extension rejects the new signature and in our case drops to the free tier limiting functionality they paid to subscribe to.
TL:DR – This is how I rotated a possibly-compromised signing key across a live Joomla subscription system without breaking the field, plus the one design idea that made it safe.
- Details
Read more: Rotating the root of trust — break-glass key rotation
Your Joomla front-end starts returning 500 errors on every page. Admin still loads. Joomla’s own error log is empty. If that’s where you are right now, and you run the JCE editor, read this before you do anything else — you may be looking at the 2026 JCE profile-import remote code execution chain, and the fix is methodical rather than complicated.
TL:DR – This is a write-up of a real incident response on a production Joomla 6.1.1 site in June 2026. Names, paths and database prefixes are anonymised; the technical details are exactly as encountered. If your symptoms match, the playbook below will get you out cleanly.
- Details
Multizone Subscriptions Manager is a Joomla extension package that provides subscription key management for extension developers. Built and shipped to production in a matter of months, it stands in 2026 as a concrete example of what disciplined iterative development looks like when strong product management, clearly defined technical constraints, and AI-assisted tooling work together — enabling a solo developer or small team to deliver a production-grade, cryptographically secure commercial platform without cutting corners or accumulating the kind of technical debt that haunts hastily assembled AI-generated software.
TL:DR – This isn't vibe coding. This is professional product management with help from AI.
- Details
Read more: Building Subscriptions Manager: An Iterative Development