Muon

Muon vs Umami Benchmark

An internal benchmark on the same Umami-compatible /api/send endpoint, identical PostgreSQL setup and realistic traffic.

How much faster is Muon than Umami?

In an internal benchmark on identical hardware and Postgres, Muon reached ~6.4× higher peak throughput, ~7× lower p99 latency, ~20× lower idle memory and ~70× faster warmup. It is an internal benchmark; results vary by hardware, Postgres config and traffic shape.

Test setup

Same endpoint, same Postgres, isolated databases.

Both systems received the identical event workload through the same Umami-compatible tracking endpoint shape, each backed by its own PostgreSQL database on the same host.

Events
111,000 events
Distinct visitors
5,000 distinct IP visitors
Endpoint
Same Umami-compatible /api/send shape
Backend
Same PostgreSQL backend type
Isolation
Isolated databases per system
CPU
10 CPU cores
Memory
8 GB RAM
Results

Higher throughput, lower latency, a fraction of the footprint.

Headline numbers from the run, then the full metric-by-metric comparison.

6.4×
Higher peak throughput
Lower p99 latency
20×
Lower idle memory
70×
Faster warmup
MetricMuonUmamiDifference
Peak throughput~5,800 rps~900 rps6.4× higher
p99 latency15 ms111 ms7× lower
Idle memory~12 MB~275 MB20× lower
Load memory~29 MB~605 MB20× lower
Image size160 MB1.28 GB8.2× smaller
Warmup0.16 s11.2 s70× faster
Interpretation

Where each system hits its limit.

Under this workload, Muon becomes PostgreSQL-bound while Umami remains application-runtime-bound. Muon's Rust core spends so little time per event that the database becomes the ceiling; Umami spends most of its budget inside the Node/Next.js application runtime before a query is ever issued.

This matters because a Postgres bottleneck can be addressed with batching, indexing, partitioning, read replicas or future analytical storage. An application-runtime bottleneck is harder to scale efficiently — you are paying overhead on every event regardless of how the database is tuned.

Reproducibility

Run the benchmark yourself.

The harness and methodology ship in the repository, so you can reproduce the run on your own hardware and Postgres configuration.

  bench
# clone, then run the benchmark harness
git clone https://github.com/runmuon/muon && cd muon && ./bench/run.sh
Caveats

Read this before quoting the numbers.

  • This is an internal benchmark run by the Muon team, not an independent third-party evaluation.
  • Results may differ by hardware, PostgreSQL configuration and traffic shape.
  • Hot-row visitor behavior — many events concentrated on the same visitor rows — narrows the gap, and is an active optimization target.
FAQ

Questions, answered directly.

Is this an independent benchmark?
No. This is an internal benchmark run by the Muon team. The harness and methodology ship in the public repository, so you can reproduce it on your own hardware.
What was the workload?
111,000 events from 5,000 distinct IP visitors, sent to the same Umami-compatible endpoint shape, with the same PostgreSQL backend type and isolated databases for each system.
Why does Muon use so much less memory?
Muon is built in Rust with a compiled, low-overhead runtime, while Umami runs on a Node/Next.js application runtime. The difference in runtime overhead accounts for the large gap in idle and load memory.
Will I see the same numbers?
Not necessarily. Results depend on your hardware, PostgreSQL configuration and traffic shape. Treat these figures as directional and reproduce the benchmark in your own environment.
Open source · self-hosted

See it for yourself.

Deploy Muon with Docker in minutes, or read how it compares to Umami feature by feature.