Cassiopeia: The Complete Guide to Joomla's Default Template
Every Joomla site since version 4 starts with the same face: Cassiopeia, the default frontend template. Many site builders treat it as a placeholder to replace as soon as possible. That is a missed opportunity: Cassiopeia is a fast, accessible, Bootstrap 5-based template that can carry a professional site on its own - if you know its options, its positions, and the right way to customise it.
This article explains the Cassiopeia template from front to back. It covers the basics and template options for owners, the module positions, menus, and customisation workflow for site builders, and the technical details - asset definitions, child templates, index.php anatomy - for developers. It builds on the Focus On articles about Joomla templates and template overrides; here everything is specifically about Cassiopeia itself.
Cassiopeia is not a demo template. It is a deliberately plain starting point that rewards everyone who looks under its hood.
The goal is simple: help you decide what Cassiopeia can do for your site, and customise it without breaking updates.
1. The Basics
1.1 What is Cassiopeia?
Cassiopeia is the standard site template that ships with every Joomla installation since Joomla 4 (the backend uses its own template, Atum). It lives in templates/cassiopeia/ with its assets in media/templates/site/cassiopeia/, and it is built on Bootstrap 5, with accessibility and performance as explicit design goals: semantic landmarks, keyboard-friendly navigation, no external font or script requests by default.
1.2 The Philosophy: a Plain Canvas
Cassiopeia looks deliberately unspectacular. It is not trying to be a page-builder theme; it is a clean, standards-compliant canvas that you shape with template options, module positions, CSS, and overrides. That plainness is a feature: there is very little to fight against, and everything Joomla can do - every component view, every module - renders correctly in it out of the box.
1.3 When Cassiopeia is Enough (and When Not)
- Enough: content sites, blogs, documentation, organisation and business sites where clear typography and structure matter more than visual fireworks. With a child template and some CSS, Cassiopeia carries these well.
- Consider something else: heavily designed marketing sites built by drag-and-drop, or projects standardised on a template framework. Even then, what you learn from Cassiopeia transfers: positions, styles, overrides, and asset handling work the same everywhere.
In my own client projects I often reach for YOOtheme Pro, a commercial template with a visual drag-and-drop builder, when the design goes beyond what Cassiopeia offers comfortably. Its builder composes full page layouts without PHP overrides, its Dynamic Content feature pulls Joomla articles and custom fields straight into any layout, and ready-made layouts shorten the path from empty site to finished design. After handover, editors maintain pages themselves without needing a developer for every change. The trade-offs: a yearly license, some lock-in to the builder's markup, and a bit heavier pages than a hand-tuned Cassiopeia child template - for a lean content site, the free default remains hard to beat.
Back to top2. The Template Options
2.1 Where They Live
Open System → Site Templates Styles → Cassiopeia - Default. The options tabs configure the template style - and because styles can be duplicated and assigned per menu item, every option here can differ per part of your site (section 7).
2.2 Brand, Logo, and Title
The brand switch shows or hides the header brand area. When it is on, Cassiopeia picks the logo in a fixed order:
- Logo (
logoFile): an uploaded image wins. - Title (
siteTitle): otherwise this text renders as the brand. - Otherwise the site name from the Global Configuration is used.
The Tagline (siteDescription) renders under the brand. Practical tip: an SVG logo stays sharp at every size and is small to load.
2.3 Layout, Fonts, and Colours
| Option | What it does |
|---|---|
fluidContainer |
Static keeps the layout at a fixed maximum width; Fluid stretches it across the full viewport. |
stickyHeader |
Keeps the header visible while scrolling. |
backTop |
Adds a back-to-top button. |
useFontScheme |
Font scheme selection; the shipped scheme loads Roboto locally - no external font CDN, good for privacy and speed. |
colorName |
Colour scheme: colors_standard or colors_alternative, each a small CSS file you can use as the model for your own. |
3. Module Positions
3.1 The Position Map
Cassiopeia defines 18 positions. The layout skeleton, top to bottom:
topbar
below-top
[ brand ] menu search
banner
top-a (card)
top-b (card)
┌──────────────┬────────────────────┬───────────────┐
│ sidebar-left │ breadcrumbs │ sidebar-right │
│ (card) │ main-top (card) │ (card) │
│ │ [ component ] │ │
│ │ main-bottom (card) │ │
└──────────────┴────────────────────┴───────────────┘
bottom-a (card)
bottom-b (card)
footer
Positions marked (card) use Cassiopeia's card chrome by default: modules there render inside a styled box with the title as a card header. The structural positions (topbar, menu, breadcrumbs, footer, ...) use no chrome. Sidebars only appear when a module is published in them - an empty sidebar costs no space.
3.2 Three Special Positions
debug: where the debug console renders when Debug System is on.error-403anderror-404: positions that render only on error pages. Publish a search module, a sitemap menu, or a friendly custom HTML module here and your 404 page becomes helpful instead of a dead end - no code required.
3.3 Seeing Positions Live
Enable Preview Module Positions in the Templates options, then append ?tp=1 to any frontend URL. Every position renders with an outline and its name - the fastest way to answer "where is top-b, really?".
A detail from the source code: Joomla reads the parameter with getBool('tp') and its boolean filter is a plain PHP cast, so any value except 0 or an empty string counts as "on". ?tp=peter-was-here switches the preview on just as well as ?tp=1 - and, more surprisingly, so does ?tp=false.
4. Menus and Navigation
4.1 The Menu Layouts
Cassiopeia ships its own menu module layouts as overrides in templates/cassiopeia/html/mod_menu/, built on the small metismenu script:
| Layout | Behaviour |
|---|---|
dropdown-metismenu |
Horizontal menu with dropdown submenus - the classic header navigation. |
collapse-metismenu |
Vertical menu with collapsible submenus - for sidebars and mobile. |
The name deserves a short explanation. MetisMenuJS is a small, MIT-licensed menu library written in plain JavaScript - no jQuery - that Joomla ships locally as a vendor package in media/vendor/metismenujs/ (4 KB minified, 1.5 KB over the wire). It opens and closes submenus by swapping CSS classes and the aria-expanded attribute on the small arrow toggler buttons, and leaves the animation to CSS - which is why Cassiopeia's submenus work with keyboard and screen readers without loading any Bootstrap JavaScript. Cassiopeia connects it through a tiny glue script (menu-metismenu.min.js, 592 bytes) that declares the library as its asset dependency, initialises it on every dropdown menu, and adds one refinement of its own: an open submenu closes again when you click anywhere outside it.
You choose the layout in the menu module's Advanced tab. A menu module in the menu position with the dropdown layout collapses automatically into the mobile "hamburger" behaviour on small screens.
4.2 The Search Slot
The search position sits at the right end of the header bar, sized for a compact search module. Publish the Smart Search module there with its title hidden for the standard header-search pattern.
5. Customising with user.css and user.js
5.1 Built-in, Update-proof Custom Code
Cassiopeia's asset definitions register two optional files that you create:
media/templates/site/cassiopeia/css/user.css
media/templates/site/cassiopeia/js/user.js
If they exist, Joomla loads them automatically - and thanks to their asset weight, user.css loads after the template's own stylesheet, so your rules win without !important battles. Joomla updates never touch these files. For small and medium customisations - colours, spacing, fonts, hiding elements - this is all you need.
5.2 A Sensible user.css Starting Point
:root {
--cassiopeia-color-primary: #1a3866; /* your brand colour */
--cassiopeia-color-link: #1a3866;
}
.site-grid {
row-gap: 2rem; /* breathing room */
}
Cassiopeia exposes its design as CSS custom properties, so most restyling is redefining variables rather than overriding selectors. Check colors_standard.css for the full list of variables it sets.
5.3 Where user.css Stops
CSS changes appearance, not markup. The moment you need different HTML - another heading structure, extra wrappers, reordered elements - you have left user.css territory and entered template overrides (see the Focus On article about template overrides). And when your customisations grow beyond a handful of files, collect them in a child template.
Back to top6. Child Templates
6.1 Cassiopeia is Inheritable
Cassiopeia declares itself inheritable in its manifest, which unlocks the Create Child Template button in the template manager (System → Site Templates → Cassiopeia Details and Files). A child template is a nearly empty template that falls back to its parent for everything you did not change - and it is the recommended home for all your customisations.
The dialog asks for a name and generates the whole child for you: a templates/cassiopeia_yourname/ folder with an empty html/ ready for overrides, a templateDetails.xml derived from the parent's, and an empty media folder structure (css, js, images, scss) under media/templates/site/. It can also copy selected existing styles to the child, so options you already configured travel along. Nothing else is duplicated - the child starts as an empty shell, which is exactly the point.
6.2 What a Child Gives You
- Its own style, selectable and assignable like any template style.
- Its own
html/folder: overrides here win over the parent's (see the overrides article). - Its own media folder (
media/templates/site/cassiopeia_mychild/) with its ownuser.css/user.js. - Updates to Cassiopeia itself never touch any of it.
6.3 The Recommended Setup
- Create a child (for example
cassiopeia_site) via the Create Child Template button. - Assign the child's style as the site default.
- Put your CSS in the child's
user.css, your overrides in the child'shtml/. - Leave the parent Cassiopeia completely untouched.
This is the same discipline as with overrides generally: your work lives in a layer updates cannot reach.
Back to top7. Template Styles in Practice
7.1 One Template, Many Styles
A template style is a saved set of option values. Duplicate the Cassiopeia (or child) style in System → Site Template Styles, change its options - another logo, fluid instead of static, a different colour scheme - and assign it to specific menu items via the style's Menu Assignment tab. Joomla then renders those pages with the other style.
7.2 What Styles Solve
- A landing-page section with a fluid, full-width layout while the rest stays static.
- A campaign or sub-brand area with its own logo and colours.
- A quiet, distraction-free style for documentation pages.
Styles cost nothing at runtime and need no extra files - they are rows in #__template_styles with a JSON params column. Before duplicating a whole template for a visual variation, check whether a second style does the job.
8. Real-World Cassiopeia Recipes
8.1 A Helpful 404 Page
Publish three modules in the error-404 position: a custom HTML module ("This page moved or never existed..."), the Smart Search module, and a menu module listing your main sections. Result: visitors who hit a dead link get search and navigation instead of a bare error - one of the cheapest UX wins in Joomla.
8.2 A Full-Width Landing Page
Duplicate your style, set fluidContainer to Fluid, assign the style to the landing menu item, and build the page from modules in top-a/top-b (which span the full width). The rest of the site keeps the static layout.
8.3 Header Search Plus Sticky Navigation
Enable stickyHeader, publish Smart Search in search with its title hidden, and the header becomes a persistent navigation-and-search bar - the pattern visitors know from every large site, with two clicks and zero code.
8.4 Your Own Colour Scheme
Copy colors_standard.css from Cassiopeia's media folder into your child's media folder under a new name, adjust the custom properties, and select it - or simply redefine the same variables in user.css if the changes are small. The variables approach keeps your scheme surviving template updates.
8.5 Bootstrap Utilities Inside Your Content
Because Cassiopeia's compiled stylesheet includes Bootstrap 5, editors can use Bootstrap classes directly in articles and custom HTML modules - no setup, no extra CSS. A two-column block inside an article is just <div class="row"> with two <div class="col-md-6"> children; spacing utilities (mt-4, p-3), flex helpers (d-flex), and button styles (btn btn-primary) all work out of the box. Keep it modest - content full of layout classes is hard to maintain - but for the occasional structured block it beats installing a page builder.
9. Under the Hood (Developer View)
9.1 The File Anatomy
| File | Role |
|---|---|
index.php |
The page skeleton: header, grid, positions, jdoc includes. |
templateDetails.xml |
Manifest: positions, options (the fields from section 2), <inheritable>1</inheritable>. |
joomla.asset.json |
Web Asset Manager definitions: styles, scripts, dependencies, weights. |
error.php, offline.php, component.php |
The error page, the offline page, and the bare component view (printing, modals). |
html/ |
Cassiopeia's own overrides: mod_menu metismenu layouts, a mod_custom banner layout, and the card/noCard chromes. |
9.2 The Asset Graph
Cassiopeia is a textbook example of the Web Asset Manager. Its joomla.asset.json defines named assets with dependencies: template.cassiopeia.ltr/.rtl (the main stylesheet per text direction), template.active (an alias the framework resolves to the active template), and template.user - the user.css/user.js pair from section 5, declared with weight 500 so it loads last. When your own extension needs to load after the template's CSS, depend on template.active instead of hard-coding file paths.
9.3 Reading index.php
The template's index.php is short and readable, and three details reward a look: the logo fallback chain (image, then siteTitle, then site name - exactly the order from section 2.2), the conditional wrappers that only render a position's markup when a module is published there, and the style="card" versus style="none" chrome choices per position. If you build your own template or child index.php, Cassiopeia is the reference implementation to imitate.
9.4 What Powers the Frontend
Bootstrap 5 provides the grid and components, metismenu the menu interactions - both shipped locally, no CDN. The template adds its own CSS on top; there is no build step to run on the server, and nothing phones home. That is worth preserving in your customisations: keep assets local, and your site stays fast and GDPR-quiet.
9.5 The SCSS Sources
Cassiopeia even ships its stylesheet sources: media/templates/site/cassiopeia/scss/ contains template.scss, template-rtl.scss, and offline.scss, importing Bootstrap and the template's own partials. The live site never compiles them - it loads the prebuilt CSS - but they are valuable in two ways: as the authoritative reference for how the template's styles are constructed, and as the starting point for a fully custom build (compile with a Sass toolchain in your development environment, ship the result as your child template's stylesheet). For everyday customisation, user.css and the CSS variables remain the right tool; reach for a custom SCSS build only when you are effectively designing your own template on Cassiopeia's foundation.
10. Overrides in Cassiopeia
Everything from the Focus On article about template overrides applies unchanged: component overrides in html/com_content/..., module overrides, layout overrides, chromes. Cassiopeia adds two things worth knowing. First, it already contains overrides of its own (the metismenu layouts and the card chromes), so it doubles as a set of worked examples in exactly the style the core team writes them. Second, because Cassiopeia is inheritable, your overrides belong in the child's html/ folder - the lookup checks the child before the parent, so the parent can keep receiving updates, overrides included.
One practical warning repeated from the overrides article, because it happens most often precisely with Cassiopeia: do not edit templates/cassiopeia/ files directly. The next Joomla update ships a new Cassiopeia and silently overwrites your work. Child template, user.css, overrides - those three survive everything.
11. Cassiopeia and the Web Services API
Template styles - including every Cassiopeia option from section 2 - are manageable over REST. The styles endpoints (v1/templates/styles/site) expose each style with its params JSON, so a provisioning script can create a fluid landing-page style or switch the site's default style remotely:
curl -H "X-Joomla-Token: <token>" \
https://example.test/api/index.php/v1/templates/styles/site
The template's files - user.css, overrides, a child's html/ folder - are filesystem artefacts outside the API's reach; deploy them with git or rsync as part of your normal deployment. And as with all presentation, none of Cassiopeia affects what the API returns: API responses are raw data, whatever template is active.
12. SEO and Metadata
Cassiopeia gives you a technically clean SEO baseline: semantic HTML5 landmarks, a sane document outline, fast rendering without external requests, and locally hosted fonts - no font CDN means one less third-party dependency for speed and for GDPR. The logo block links to the homepage with the site name as accessible text, and error pages are real pages you can furnish (section 8.1) rather than dead ends.
Two things remain your responsibility. First, the heading structure inside content: Cassiopeia renders what components and modules give it, so keep the one-h1-per-page discipline in your articles and module titles - card chrome renders module titles as headings, which is exactly why module title levels matter. Second, image discipline in the brand area: give the logo file a descriptive name and remember the alt text comes from the site name; if you replace the header with a custom override, keep that accessible name intact.
Back to top13. Common Mistakes and Pitfalls
13.1 Editing Cassiopeia's Files Directly
Symptom: custom CSS or template edits disappeared after a Joomla update.
Fix: Joomla updates replace templates/cassiopeia/ and its media folder. Redo the work in the update-proof layers: user.css, a child template, overrides. Then it never happens again.
13.2 user.css Does Not Load
Symptom: the file exists but nothing changes.
Fix: check the exact location and name: media/templates/site/cassiopeia/css/user.css (or the child's media folder when a child style is active - a user.css in the parent is not loaded for a child). Then clear the cache and force-reload the browser.
13.3 The Logo Options Fight Each Other
Symptom: you set a title but an image shows, or the site name appears instead of your title.
Fix: remember the order: image beats title beats site name. Clear the logoFile field if you want the text title; set brand off to hide the block entirely.
13.4 Modules Missing Their Box (or Having One Too Many)
Symptom: a module renders with an unexpected card, or without the card you wanted.
Fix: the position determines the default chrome (section 3.1), and each module can override it under Advanced → Module Style. Set it explicitly to card or noCard when the position default does not fit.
13.5 Customising the Parent While a Child is Active
Symptom: overrides or CSS added to Cassiopeia have no effect.
Fix: the active style belongs to the child, and the child's files win. Move the customisation into the child - which is where it belonged anyway.
13.6 Expecting a Page Builder
Symptom: frustration that Cassiopeia has "so few settings" compared to commercial templates.
Fix: Cassiopeia's settings are deliberately few; its power sits in styles, positions, user.css, and overrides. Invest a day in those four mechanisms and you have more control than most template control panels give - with less lock-in.
Back to top14. Best Practices
If you remember only a few things from this article, remember these:
- Never edit Cassiopeia's own files; put everything in a child template,
user.css, and overrides. - Create the child template on day one - even if it starts empty, every later customisation has a safe home.
- Prefer redefining CSS custom properties over overriding selectors; check
colors_standard.cssfor the variable names. - Use template styles (duplicated, menu-assigned) for per-section variations instead of extra templates.
- Furnish the
error-403/error-404positions - a helpful error page costs five minutes. - Keep assets local, as Cassiopeia does: no font or script CDNs.
- Use
?tp=1position preview before asking where a position is. - Treat Cassiopeia's own
html/folder andjoomla.asset.jsonas reference reading for your own template work.
15. Quick Reference
FILES templates/cassiopeia/ index.php, manifest, html/
media/templates/site/cassiopeia/ css, js, fonts
user files: css/user.css + js/user.js (load last, update-proof)
OPTIONS brand / logoFile / siteTitle / siteDescription
logo order: image > title > site name
fluidContainer, stickyHeader, backTop
useFontScheme (local Roboto), colorName (standard/alternative)
POSITIONS topbar below-top menu search banner
top-a top-b (card)
sidebar-left | breadcrumbs main-top [component]
(card) | main-bottom (card) | sidebar-right (card)
bottom-a bottom-b (card) footer
special: debug, error-403, error-404
preview: ?tp=1 (enable in Templates options)
MENU html/mod_menu: dropdown-metismenu (horizontal)
collapse-metismenu (vertical)
search position = compact header search slot
CHILD manifest: inheritable = 1
System > Site Templates > Create Child Template
child html/ + child user.css win over parent
STYLES duplicate style > change options > Menu Assignment
stored in #__template_styles (params JSON)
API: v1/templates/styles/site
CHROMES card (boxed, title as header) / noCard
per module: Advanced > Module Style
RULES never edit cassiopeia files - child/user.css/overrides
assets local, depend on template.active
Back to top16. Summary
Cassiopeia rewards a closer look than most people give it:
- A deliberate canvas: Bootstrap 5-based, accessible, fast, with local assets and no external dependencies.
- Options with leverage: brand and logo fallback, static or fluid width, sticky header, local font scheme, and swappable colour schemes.
- 18 positions including the special
error-403/error-404slots that turn error pages into helpful pages. - Update-proof customisation layers:
user.css/user.jsload automatically and last; child templates (Cassiopeia is inheritable) hold overrides and assets; template styles cover per-section variation. - A reference implementation: its
index.php, asset definitions, menu layouts, and chromes are the worked examples for any Joomla template work. - Clear boundaries: styles are manageable via the API; files deploy via git; nothing in the template touches what the API returns.
You do not need to replace Cassiopeia to get a professional site. You need a child template, a user.css, a handful of well-chosen overrides, and an hour with the options - after that, the template quietly does its job for years.
And if your site runs on a heavily modified Cassiopeia - or a commercial template that fights every update - it is worth knowing that migrating to a clean child-template setup is a well-defined, methodical job: inventory the customisations, move them into the update-proof layers, verify page by page. That is exactly the kind of structured work a Joomla specialist does well, and it pays back at every update that follows.
Back to top

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












