Open-source registry

We ❤️ open source

We load-test popular open-source software on modest, declared resources and publish what we find, so maintainers and users know what a self-hosted install can take.

Projects we tested

Synthetic load from one generator outside the app; real traffic and the app's own metrics are not part of it. Rates are requests per second across all steps of a visit.

Medusa

Commerce

Headless commerce platform. A shop visit: browse, search, cart, shipping, checkout.

License
MIT
Version tested
2.21.2
Repository
github.com/medusajs/medusa
Resources (declared)
Railway: app 2 vCPU / 2 GB (one Node process); Postgres and Redis without a limit
  • Small catalog

    Tested Oct 1, 2026 · 5 Load Runs
    Holds 13.5 req/s · 12 h
    30 min · not held60 min · held3 h · not held12 h · held
    Limit search, short steps
    ~17 req/s held, failed at ~29; 6 steps with too few samples to check at that rate
    Latency bound
    p95 ≤ 1.5 s

    What this does not show

    • Checkout steps fail the latency bound first; that the single Node process is the limit is a hypothesis from CPU readings, not a diagnosis.
  • Large catalog

    Tested Oct 1, 2026 · 6 Load Runs
    Holds 18 req/s · 12 h
    30 min · held60 min · held3 h · held12 h · held
    Limit search, short steps
    ~22 req/s held, failed at ~31; 6 steps with too few samples to check at that rate
    Latency bound
    p95 ≤ 1.5 s

    What this does not show

    • Search errors set the limit. Postgres had no resource limit, so how much of the machine it used is not fixed between runs.
  • Black Friday

    Tested Oct 2, 2026 · 5 Load Runs
    Holds 24.5 req/s · 12 h
    30 min · held60 min · held3 h · held12 h · held
    Limit search, short steps
    ~30 req/s held, failed at ~35; 6 steps with too few samples to check at that rate
    Latency bound
    p95 ≤ 1.5 s

    What this does not show

    • Black Friday here is a heavier checkout mix at a constant rate, not a traffic spike.

Ghost

Media and publishing

Publishing platform. Readers open the home page, articles, tags and authors; a few sign up.

License
MIT
Version tested
6.67.0
Repository
github.com/TryGhost/Ghost
Resources (declared)
Railway: Ghost 2 vCPU / 2 GB behind a Caddy proxy 2 vCPU / 2 GB, no CDN; MySQL 8.4 from a template
  • Normal day

    Tested Oct 1, 2026 · 5 Load Runs
    Holds 39 req/s · 60 min
    30 min · held60 min · held3 h · no verdict
    Limit search, short steps
    ~49 req/s held, failed at ~63; 6 steps with too few samples to check at that rate
    Latency bound
    p95 ≤ 1.5 s

    What this does not show

    • The 3 h run has no verdict: our load generator had seconds of health gaps, so the run was voided and refunded. It says nothing about Ghost either way.
    • Ghost's origin was tested without a CDN; a public site behind one serves more.
  • Viral article

    Tested Oct 1, 2026 · 6 Load Runs
    Holds 53.5 req/s · 3 h
    30 min · held60 min · held3 h · held (1 of 2)
    Limit search, short steps
    ~67 req/s held, failed at ~89; 15 steps with too few samples to check at that rate
    Latency bound
    p95 ≤ 1.5 s

    What this does not show

    • Viral here is a mix with one hot article at a constant rate, not a ramp and a tail.
    • Of the two 3 h runs, one has no verdict because of our generator's health gaps (older harness); the rerun held.

pretix

Ticketing

Ticket shop. A visit reads the event widget, reserves seats, places and pays an order through the REST API.

License
AGPL-3.0 (with additional terms)
Version tested
2026.8.0
Repository
github.com/pretix/pretix
Resources (declared)
Railway: pretix 2 vCPU / 2 GB (3 gunicorn workers); Postgres and Redis from templates
  • Normal sales

    Tested Oct 1, 2026 · 5 Load Runs
    Holds 25.6 req/s · 60 min
    30 min · held (1 of 2)60 min · held3 h · not held
    Limit search, short steps
    ~32 req/s held, failed at ~60
    Latency bound
    p95 ≤ 1.5 s

    What this does not show

    • The missed 30 min and 3 h runs failed only on refused reservations: small quotas sold out, and the check of that time counted a sold-out seat as a failure. Latency and HTTP errors were within the bound.
  • Hot concert on sale

    Tested Oct 1, 2026 · 5 Load Runs
    Holds 13.4 req/s · 3 h
    30 min · held60 min · not held3 h · held
    Limit search, short steps
    20 req/s held, failed at 32
    Latency bound
    p95 ≤ 1.5 s

    What this does not show

    • The 60 min run missed when the VIP category sold out. The 3 h run had 60,000 seats per category so nothing sold out: it measures a sustained hot-event load, not a 15,000-seat on-sale with a sell-out.

Lago

Usage-based billing

Metering and billing. Clients send usage events and read current usage, customers and invoices.

License
AGPL-3.0
Version tested
1.53.0
Repository
github.com/getlago/lago
Resources (declared)
Railway: API (Puma) 2 vCPU / 2 GB and Sidekiq worker 2 vCPU / 2 GB; Postgres and Redis from templates
  • Normal month

    Tested Oct 1, 2026 · 4 Load Runs
    Holds 25.6 req/s · 3 h
    30 min · not held60 min · held3 h · held
    Limit search, short steps
    32 req/s held, failed at ~64; 4 steps with too few samples to check at that rate
    Latency bound
    p95 ≤ 1.5 s

    What this does not show

    • The missed 30 min run failed only on the delivery of a step taken by 1% of visits: a sampling artefact of the rule of that time (since replaced). Latency and errors passed.
  • Month end

    Tested Oct 1, 2026 · 4 Load Runs
    Holds 25.6 req/s · 3 h
    30 min · held60 min · held3 h · held
    Limit search, short steps
    ~8 req/s held, failed at ~32; 3 steps with too few samples to check at that rate
    Latency bound
    p95 ≤ 1.5 s

    What this does not show

    • The search's low range is a delivery artefact of the rule of that time (rare steps sampled short), not the app slowing down: the longer runs at a higher rate held.
    • Month end here is a heavier read mix at a constant rate; invoice generation at the period rollover was not tested.

Tile38 + OSRM + Photon

Ride-hailing geo backendIn progress

Driver positions and nearby search (Tile38), routes and ETA matrices over the Moscow road graph (OSRM), geocoding (Photon).

License
MIT (Tile38), BSD-2-Clause (OSRM), Apache-2.0 (Photon)
Version tested
Tile38 1.38.0, OSRM 26.10.0, Photon 1.3.0
Repository
github.com/tidwall/tile38
Resources (declared)
Railway: Tile38 2 vCPU / 2 GB, OSRM 2 vCPU / 2 GB, Photon 2 vCPU / 8 GB

Campaign in progress: a normal evening, rush hour in rain and the end of a stadium match. Results appear here once the runs are final.

  • Normal evening
  • Rush hour in rain
  • Stadium event