Skip to main content

Cassiopeia: The Complete Guide to Joomla's Default Template

03 August 2026

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 top

2. 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:

  1. Logo (logoFile): an uploaded image wins.
  2. Title (siteTitle): otherwise this text renders as the brand.
  3. 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

OptionWhat 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.
Back to top

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-403 and error-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.

Back to top

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:

LayoutBehaviour
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.

Back to top

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 top

6. 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 own user.css / user.js.
  • Updates to Cassiopeia itself never touch any of it.
  1. Create a child (for example cassiopeia_site) via the Create Child Template button.
  2. Assign the child's style as the site default.
  3. Put your CSS in the child's user.css, your overrides in the child's html/.
  4. 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 top

7. 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.

Back to top

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.

Back to top

9. Under the Hood (Developer View)

9.1 The File Anatomy

FileRole
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.

Back to top

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.

Back to top

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.

Back to top

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 top

13. 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 top

14. 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.css for the variable names.
  • Use template styles (duplicated, menu-assigned) for per-section variations instead of extra templates.
  • Furnish the error-403/error-404 positions - a helpful error page costs five minutes.
  • Keep assets local, as Cassiopeia does: no font or script CDNs.
  • Use ?tp=1 position preview before asking where a position is.
  • Treat Cassiopeia's own html/ folder and joomla.asset.json as reference reading for your own template work.
Back to top

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 top

16. 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-404 slots that turn error pages into helpful pages.
  • Update-proof customisation layers: user.css/user.js load 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
Cassiopeia: The Complete Guide to Joomla's Default Template
Peter Martin
Peter Martin
Joomla Specialist

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