To customize Joomla without editing core files, put every change in a layer Joomla will not overwrite: a child template, user.css / user.js, a layout override in html/, a language override, a template style, or a custom plugin. Do not edit files under components/, modules/, plugins/, libraries/, or the parent template. Those paths come back to stock on the next Joomla, PHP, or extension update. This holds on Joomla 4.1+, 5.4, and 6. On Joomla 3 there is no Create Child Template button. You still use html/ overrides and language overrides. You do not patch core there either.
Editing Cassiopeia, com_content, or a plugin “just this once” is how sites get stuck on old Joomla. The safe stack is smaller than it looks. Pick the smallest tool that matches the job, keep the parent stock, and check overrides after every update.

Updates replace core and the parent template. Your child, language overrides, and custom plugins stay.
What you will learn
- What counts as a core file (and what does not)
- Which Joomla tool to use for CSS, HTML, wording, and behaviour
- How to set up a child template so CSS and overrides survive updates
- Where
user.cssactually lives on Cassiopeia - How Create Overrides copies layouts into
html/ - When a language override or a custom plugin is the real fix
- What to re-check after a Joomla update
The problem core edits create
You change one PHP file. The header looks right. Two weeks later Joomla ships a security release. The updater replaces that file. The header is stock again. Or worse: the update skips the file because it differs from the package, and you sit on an unpatched copy.
That is not a discipline problem. It is how Joomla packages work. Core and most extension files are owned by the installer. Template styles (logo, colour params, menu assignment) live in the database and survive. Files you typed into components/com_content/ do not.
The fix is not “remember to re-apply the hack.” The fix is never putting the hack in a path the installer owns.
Official layout override model: Layout Overrides in Joomla. Child templates: Joomla User Manual, Child Templates. Cassiopeia user.css: Cassiopeia Template Customisation.
What counts as a core file
Treat these as do not edit:
| Path | Why |
|---|---|
components/com_* |
Joomla and extension updates replace views |
modules/mod_* |
Same for module chrome and tmpl |
plugins/* |
Event code and plugin tmpl come back on update |
libraries/ |
Framework. A one-line patch here is a future outage |
media/vendor/ and compiled template CSS you did not create |
Next build or update wipes it |
| Parent template files (Cassiopeia, Atum, a club parent) | The parent is the package. Your child is the overlay |
These are safe homes when you use them as designed:
| Place | What it stores |
|---|---|
| Child template | user.css, user.js, html/ overrides, extra positions, optional index.php |
| Template style | Params, logo, menu assignment. Not PHP. |
| Language override | UI strings. Not markup. |
| Custom fields | Extra data on articles, contacts, users |
| Custom plugin or module you installed | Behaviour you own. You still update that extension yourself. |
A duplicate of the whole Cassiopeia folder renamed “Cassiopeia custom” is not a child. It is a fork. You now maintain hundreds of files you did not write, and Cassiopeia security fixes never reach it.
Pick the smallest safe tool

If CSS can do it, stop. If the string is a language key, do not override PHP to change a label.
| You want to… | Use | Do not |
|---|---|---|
| Change colour, spacing, hide a block that already has a class | user.css in the active template (child if you have one) |
Edit template.min.css or Bootstrap in media/ |
| Add a small script | user.js or a proper Web Asset. Walkthrough: Add custom JavaScript to Joomla |
Paste <script> into core index.php |
| Change article, blog, or module HTML | Layout override in html/ |
Edit components/ or modules/ |
| Change plugin HTML (Prev/Next, vote, a field type) | Plugin override in html/plg_… when the plugin has tmpl. Guide: Joomla plugin override |
Edit plugins/content/… |
| Change a label, button, or email subject | Language override | Search-and-replace in PHP |
| Extra data (price, spec, event date) | Joomla custom fields | Hack the article table |
| Different logo or brand colour per section | Template style (and a child if files must differ) | Duplicate the whole template |
| Different markup on one category only | Alternative layout (filename without a leading underscore) | if ($catid == 12) inside a core view |
| Change how Joomla behaves (redirect, ACL, a new event) | Custom plugin, or an extension you can update | Patch libraries/ |
| Survive parent template updates | Child template | Edit Cassiopeia in place |
The rest of this article is the order of operations. The child-template post is the click-by-click for Create Child Template. Use that when you reach Step 2. Do not skip it and drop user.css into the parent “for now.”
Step 1: Name the change before you open a file
Write one sentence: “I need the article byline stacked, not inline,” or “I need the header background #0b3d5c,” or “I need Read more to say Continue.”
Then classify it:
- Look only (colour, type, hide): CSS.
- Markup (extra wrapper, different heading level, remove a div): layout override.
- Wording: language override. Confirm with Debug Language if you are unsure which key it is.
- Data: custom field, not a new column in
#__contentby hand. - Logic: plugin. If you cannot name the event (
onContentPrepare,onAfterRoute), you are not ready to write PHP.
If you cannot classify it, you are about to edit the wrong file.
Step 2: Create a child template (Joomla 4.1 and later)
On Joomla 4.1, 5, and 6, open System → Templates → Site Templates, open an inheritable parent (Cassiopeia is the one that ships ready), and click Create Child Template. Assign the child’s style as default or per menu item.
Full clicks, media/ vs templates/, Atum, and making a custom parent inheritable: How to set up a Joomla child template.
Until that style is assigned, the public site still uses the parent. Creating the child does not change the frontend by itself.
Joomla 3: there is no native child. Keep overrides in your template html/ folder. Prefer a template you control, not a club template you will overwrite on the next vendor zip. Plan the Joomla 3 to 6 upgrade so you can use children.
Joomla 6: Cassiopeia Extended is already a child of Cassiopeia. Do not hack Extended as if it were a parent. Copy the child (6.1) or create your own child of Cassiopeia.

Do these in order. CSS first. PHP last.
Step 3: Put CSS in user.css (not in the compiled sheet)
Cassiopeia loads user.css if the file exists. On Joomla 4.1 and later the path is:
media/templates/site/{template}/css/user.css
For a child named cassiopeia_brand, that is media/templates/site/cassiopeia_brand/css/user.css, not the parent’s file. A child does not load the parent’s user.css. If you already wrote rules in Cassiopeia and then created a child, copy them into the child’s file or the site will look stock.
In Template Manager: open the template, select the css folder, New File, name user (no suffix), type .css.
The Joomla 4.0-only path templates/cassiopeia/css/user.css was moved into media/ when child templates landed. If your CSS “does nothing,” you are almost always in the old folder, or you assigned a child while the file still sits on the parent. The next article in this series is the CSS-not-showing checklist. Until then, use the child-template user.css section.
Keep !important rare. Cassiopeia registers user.css with a high asset weight so it loads after the template sheet.
Step 4: Override HTML with Create Overrides
For component and module layouts:
- System → Templates → Site Templates → {your child} → Create Overrides
- Pick the component view or module.
- Joomla copies the file into
templates/{child}/html/… - Edit that copy only.
Filename rules matter. A copy named _default.php or a typo in the folder (com_content/article vs com_content/articles) means Joomla never loads it. Create Overrides is there so the path is correct.
Plugin layouts usually do not appear in that list. You copy tmpl by hand into html/plg_{group}_{element}/. Details: plugin overrides in the html folder.
After a Joomla update, open the template’s Overrides (or Updated Files) list. If core changed a layout you overrode, diff your copy. Joomla documents this as override management. It does not watch user.css or user.js. You review those yourself.
🔗 Layout Overrides in Joomla
Folder map for components, modules, plugins, and JLayouts.
Step 5: Change wording with a language override
If the public string exists in a .ini language file, System → Language Overrides. Site vs Administrator is a different list. Debug Language shows the constant on the page.
Do not override default.php to change “Read more.” That is a core-edit habit with extra steps.
Setup: Joomla language overrides.
Step 6: Add data with custom fields, not a core hack
Price, subtitle, event date, and spec tables belong in Content → Fields. Automatic display or a field layout in the child. If you still run K2 extra fields, migrate on Joomla 3 first: K2 to com_content.
Fields how-to: Joomla custom fields.
Step 7: Change behaviour with an extension you own
Redirect rules, extra authentication, “hide this module when…” that CSS cannot express: write or install a plugin. Leave plugins/system/sef and libraries/src alone.
If an installed extension is broken, do not patch its PHP on the server. Duplicate the plugin with a new element name, or wait for the vendor, or replace it. A patched third-party file is the same class of problem as a patched core file.
Need a plugin built to spec? Joomla plugin development.
After every Joomla or template update
- Clear Joomla cache and your browser cache.
- Open the child template Overrides list. Diff any layout Joomla marked as updated.
- Skim
user.cssfor selectors that no longer exist (Cassiopeia class names do change between major versions). - Confirm the child style is still default or still assigned to the right menus.
- If you use a club parent, read the vendor notes before you copy their new
index.phpover your child copy.
This five-minute pass is cheaper than discovering a blank header on Monday.
What this does not replace
A child template is not a page builder, a CDN, or a backup. It does not fix PHP 8 fatals from an old extension. It does not make a commercial template inheritable until the vendor sets <inheritable>1</inheritable> and moves CSS under media/.
Safely customize Joomla without editing core files means you still test on staging. Overrides can be wrong. CSS can hide the cart button. The rule is only: when it is wrong, the stock parent is still there to compare against.
Key takeaways
- Never edit
components/,modules/,plugins/,libraries/, or the parent template to “make it look right.” - Classify the job: CSS, HTML, string, data, or behaviour. Use one tool.
- On Joomla 4.1+, create a child, assign its style, then add files.
- Cassiopeia custom CSS belongs in
media/templates/site/{template}/css/user.csson the active template. - Layout overrides live in the child’s
html/folder. Create Overrides for components and modules. Plugintmplis usually manual. - Labels go through language overrides. Extra article data goes through custom fields.
- After updates, diff overridden PHP. Review
user.cssyourself. Joomla will not do that for you.
If the next problem is “I did all this and the CSS still does not load,” that is the 4 September post in this series. If the override PHP does not run, that is the 11 September post.
Need a template customized without forking core on a client site? Joomla design services.
Related Joomla troubleshooting
- Joomla CSS changes not showing
- Joomla JavaScript not working
- Template override not working
- Template override disappeared after an update
- Joomla module not showing
- Custom fields not showing
Frequently asked questions
Can I customize Joomla without editing core files?
Yes. Use a child template, user.css, layout overrides in html/, language overrides, custom fields, and custom plugins. Leave core and parent template files stock.
Is editing Cassiopeia the same as a child template?
No. Cassiopeia is the parent package. Updates replace it. A child stores only your files. Setup: Joomla child template.
Where do I put custom CSS in Joomla 5?
For Cassiopeia, media/templates/site/cassiopeia/css/user.css, or the same path under your child name. Create the file if it is missing. The old templates/cassiopeia/css/ location is the Joomla 4.0-era path.
Do template overrides survive a Joomla update?
Overrides in a child (or in a template Joomla does not overwrite) stay on disk. The source layout in components/ may change. Diff your copy after the update. CSS is not in that checker.
Can I edit a plugin file if I back it up?
You can. The next extension update still overwrites it, or the updater skips it and you stay unpatched. Use an html/plg_… override when there is a tmpl, or a plugin you own when you need logic.
What about Joomla 3?
No native child template. Use html/ overrides and language overrides on a template you control. Do not patch components/. Move to 4.1+ when you can so children exist.
Is a template style enough?
For logo, colour parameters, and menu assignment, yes. For PHP, CSS files, and overrides, you need a child (or a template you fully own). A style still points at the same files.
SEO Metadata
| Field | Value |
|---|---|
| Meta Title | Safely Customize Joomla Without Editing Core Files |
| Meta Description | Change Joomla CSS, HTML, and strings without hacking core. Use a child template, user.css, layout overrides, and language overrides so updates keep your work. |
| URL Slug | joomla-customize-without-editing-core |
| Focus Keyword | customize Joomla without editing core |
Character counts:
- Meta Title: 50 chars
- Meta Description: 158 chars
HTML Meta Tags
<title>Safely Customize Joomla Without Editing Core Files</title>
<meta name="description" content="Change Joomla CSS, HTML, and strings without hacking core. Use a child template, user.css, layout overrides, and language overrides so updates keep your work." />
<link rel="canonical" href="https://www.infyways.com/joomla-customize-without-editing-core/" />
<meta property="og:title" content="Safely Customize Joomla Without Editing Core Files" />
<meta property="og:description" content="Change Joomla CSS, HTML, and strings without hacking core. Use a child template, user.css, layout overrides, and language overrides so updates keep your work." />
<meta property="og:url" content="https://www.infyways.com/joomla-customize-without-editing-core/" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Safely Customize Joomla Without Editing Core Files" />
<meta name="twitter:description" content="Change Joomla CSS, HTML, and strings without hacking core. Use a child template, user.css, layout overrides, and language overrides so updates keep your work." />


























