How Lumeo stays at 306 KB
What the browser actually downloads — brotli-compressed assembly size, measured 2026-05-13 (rc.45).
Per-package breakdown
Install only the satellites you use. Each row shows the brotli-compressed size that package adds to your published WASM app.
What's actually in the core .nupkg
The .nupkg contains more than what reaches the browser. Here's the full inventory.
1.9 MB raw IL → 400 KB after WASM linker trimming + brotli compression. This is the only file the browser downloads from the Lumeo package.
Theme tokens, dark-mode variable swaps, and component-scoped styles. Generated by Tailwind v4 at build time — no CSS-in-JS, no runtime style injection.
Focus traps, scroll lock, element measurement, and third-party canvas wrappers. JS is reserved for what Blazor genuinely cannot do in pure Razor.
MSBuild .props integration (auto-imports lumeo.css + components.js), PDB symbols for debugging. Never reaches the browser.
Total: ~556 KB compressed in the .nupkg — matches the NuGet "Download package" badge. The 400 KB brotli number is just the DLL, which is the only thing the WASM linker ships to the browser.
What's not in core
The dependencies we said no to.
How it compares
Brotli-compressed DLL size for the core package of each library.
| Library | Core brotli size |
|---|---|
You Lumeo (core) |
400 KB |
FluentUI Blazor |
~500 KB |
MudBlazor |
~600 KB |
Radzen Blazor |
~700 KB |
Telerik UI Blazor |
~1 MB+ |
* Approximate brotli sizes for the core library DLL of each project at their latest stable release as of 2026. Independent verification recommended — numbers vary by build configuration and linker trimming.
Heavy features are opt-in
Don't need charts? ECharts never touches your build. Don't need a data grid? ClosedXML and QuestPDF aren't downloaded.
Charts
Lumeo.Charts
ECharts lazy-loaded only when a chart component mounts — never included unless you reference the package.
DataGrid
Lumeo.DataGrid
ClosedXML + QuestPDF are pulled in only when the package is referenced. Full virtualization, group-by, and export — on demand.
Rich Text Editor
Lumeo.Editor
TipTap JS lazy-loaded at component mount time. The DLL is only 26 KB — the heavy JS only streams when the editor renders.
Why brotli, not .nupkg?
NuGet shows 1.35 MB for the core .nupkg — here's what that actually means.
Hot Reload that actually works
Six architectural choices that keep dotnet watch
fast and reliable on Lumeo apps — the same choices most Blazor UI libs make differently and pay for in
slow rebuilds, stale styles, or forced full-restart loops.
No Blazor CSS isolation
Lumeo styles every component via Tailwind utility classes composed directly in markup. Tailwind v4 watch mode regenerates the single utility bundle in under 100 ms; the browser swaps it without losing state.
Theme is CSS variables — not a C# object
Switching themes in Lumeo means swapping --color-primary, --color-background, etc. in lumeo.css. No C# rebuild needed. dotnet watch picks up the CSS change and the browser re-paints with the new tokens.
No source generators in the runtime hot path
Lumeo.SourceGenerators only emits code for the opt-in [LumeoForm] attribute. Normal component edits never re-run a generator, so the dotnet watch inner loop is just Roslyn incremental compile + DOM patch.
No reflection in the render path
DataGridColumn<T>.GetValue is a compiled Expression<Func<TItem,object?>> cached per field (rc.44). Component parameters are strongly typed records. Hot Reload can swap method bodies without invalidating any cached type-handle metadata.
CascadingValue composition, not inheritance
Compound components like Select / SelectTrigger / SelectContent share state via a record passed through CascadingValue. Each Razor file is independent and Hot Reload swaps it in isolation.
Razor SDK + Tailwind watch — one CSS bundle
lumeo.css + lumeo-utilities.css are two files generated by Tailwind from your source. dotnet watch + npm run watch:css run in parallel; CSS swaps don't go through Blazor at all. No virtual-DOM diff for visual-only changes.
Edit a Razor component → DOM patches in ~120 ms. Edit
lumeo.css
or a theme variable → CSS swaps in ~50 ms with zero C# rebuild. Edit a Lumeo source-of-truth
record (e.g. DataGridColumn<T>) →
delta build + DOM patch in under a second. No "Hot Reload not supported, restarting"
spinner on the inner loop.
See it for yourself
Add Lumeo to a project, publish it, and measure. We believe the numbers.