What a Moodle theme costs you, measured
Every Moodle theme page says the theme is fast, clean and lightweight. None of them says how many kilobytes. I measured four on one site and wrote down how, so you can disagree with the method rather than the adjective.
8 October 2026
The numbers
Moodle 5.2.2+, PHP 8.4, one site, every theme installed side by side and left at its defaults. The figure that matters is the gzipped one, because that is what crosses the wire.
| Theme | Raw | Gzipped | vs Boost |
|---|---|---|---|
| Boost (core) | 1,077,523 | 175,176 | — |
| Classic (core) | 1,083,720 | 176,114 | +0.5% |
| Atrium (mine) | 1,223,940 | 198,639 | +13.4% |
| Moove | 2,032,734 | 318,327 | +81.7% |
Two things stand out. Classic, which looks like a different theme, costs almost exactly what Boost costs: under a kilobyte more. Nearly all of what you see is Bootstrap and Moodle's own component CSS, and the theme layer on top is thin. And the spread between the lightest and the heaviest is about 143 KB gzipped, which on a slow connection is noticeable and on a fast one is not.
Why Classic costs nothing and Moove costs 143 KB
A Moodle theme is usually a Boost child: it inherits the entire compiled stylesheet and appends its own. So the floor is whatever core emits, and the only variable is what the theme adds on top. Classic adds a little. Atrium adds about 23 KB for a sidebar, a card dashboard, a catalogue, an enrolment page, seven colour presets, a dark scheme and a print sheet. Moove adds about 143 KB.
That is not a criticism of Moove. It is the most installed free theme on the Marketplace by a wide margin, and it earns that. But it is worth knowing that choosing it costs you the better part of a megabyte uncompressed, and nobody tells you.
The thing nobody measures: what gets fetched from elsewhere
Page weight is the obvious question. The more interesting one is whether the browser is sent to another company's servers to render your site.
At default settings, none of these four fetch anything external. But Moove offers a site font setting, and choosing anything other than the default sends every page load to fonts.googleapis.com and fonts.gstatic.com. That is a reasonable feature and it is off by default. It is also a data protection question the moment someone turns it on, and the setting does not say so.
This is the part I would check before picking any theme: not how big it is, but who else your learners' browsers are talking to.
Take the numbers again
Install the themes side by side, then fetch each compiled stylesheet at the current theme revision:
for t in boost classic atrium moove; do
curl -s "http://yoursite/theme/styles.php/$t/<themerev>/all" -o /tmp/$t.css
echo "$t raw=$(wc -c < /tmp/$t.css) gzip=$(gzip -c /tmp/$t.css | wc -c)"
done
themerev comes from php admin/cli/cfg.php --name=themerev. One trap cost me a confusing half hour: purging Moodle's caches does not reliably rebuild the compiled stylesheet. Call theme_reset_all_caches() first, or you will measure the previous theme's CSS and believe a setting did nothing.
For external requests, grep the compiled CSS for url(http and the theme's own source for font hosts. Comment blocks are full of URLs that are never fetched, so match on what the browser would actually request, not on any URL in the file.
What this does not tell you
Nothing here is a claim about speed. I measured bytes, not render time, not paint, not interaction. Doing that honestly needs a quiet machine, a warm cache, many samples and every theme under identical load, and none of that happened. A stylesheet 23 KB larger than Boost is a fact about download size and nothing more.
It is also one site with one set of plugins. Yours will differ. That is why the method is here.
Boost Union is missing from the table because it was not installed on the machine these came from, and a number I have not taken does not belong in a table.