A showcase app built with Plumix

NetBench — HTTP load testing in your pocket

Hit an API with hundreds of concurrent users and watch throughput, latency percentiles and errors update live. Run a deep analysis on the desktop, or check prod from your phone while you're on call.

Coming soon toApp Store
Coming soon toGoogle Play
Open source on GitHub No account, no tracking

Running

Checkout API · 200 users

00:24 / 01:00

RPS

1 284

p95

123 ms

Errors

0.2%

p5045 ms
p99287 ms
Active198

Illustrative example of the live monitor.

Use cases

What you test with NetBench

A k6, hey or wrk-style load generator with a real interface — for backend developers, SRE and QA engineers.

Capacity check before a release

Point a scenario at a new endpoint, raise concurrent users and watch where p95 and p99 start to bend. You get the throughput the service actually holds, not the one in the design doc.

On-call sanity check from your phone

Paste a URL into Quick test, run a short burst and see RPS, p95 and error rate on one screen. Enough to tell "prod is slow" from "my Wi-Fi is slow" without opening a laptop.

Before and after a deploy

Run the same scenario on the old and the new build and put the two reports side by side on the desktop. Regressions in latency or error rate show up as numbers, not impressions.

Finding the breaking point

Ramp-up adds workers gradually over a set time, so you can see the moment latency climbs or errors appear instead of hitting the service with everything at once.

Local and staging stands

Plain http:// targets work on Android and iOS too — local machines, VPN-only staging, containers on your LAN. Mobile platforms block cleartext by default; NetBench allows it on purpose.

Realistic traffic, not just GET /

Each virtual user walks through a list of steps — any HTTP method, path, custom headers such as Authorization, a JSON body — with optional think time between iterations.

How it works

Configure, run, read

01

Describe the load

  • Target URL and a list of request steps
  • Method, path, headers and JSON body per step
  • Concurrent users and test duration
  • Ramp-up and think time
02

Run and watch

  • One async worker per virtual user
  • Metrics refresh four times a second
  • Stop at any moment — partial results are kept
  • The UI stays smooth however hard the engine works
03

Read the report

  • Summary of latency, throughput and errors
  • Latency-over-time chart and status-code table
  • Desktop: compare two runs side by side
  • Export to JSON, CSV or HTML; copy a summary on mobile

What gets measured

Throughput

Requests per second, live

Latency p50 · p95 · p99

Percentiles from an HDR histogram

Min · mean · max

Full latency spread for the run

Error rate

Network failures and HTTP 4xx/5xx

Status codes

Breakdown of every response code

Active connections

Requests in flight right now

Bytes received

Total response traffic

Latency over time

Timeline chart in the report

Why C#

Why a load tester is written in .NET

Load generation is the one kind of app where the runtime shows up directly in the results. That is exactly why NetBench is the Plumix showcase.

The tool must not be the bottleneck

A load generator that allocates per request ends up measuring its own garbage collector. In NetBench every result is a small readonly struct passed by reference, response bodies are drained into pooled buffers, and there is no LINQ on the hot path — so GC pressure stays flat and latency spikes belong to the server under test.

Concurrency is a language feature

Hundreds of virtual users are plain async Tasks throttled by a SemaphoreSlim. Results flow through a bounded Channel<T> with a single reader, counters use Interlocked, and CancellationToken stops a run cleanly mid-flight. No thread-per-user, no callback soup — on a phone as well as on a workstation.

One engine, every platform

The load engine, statistics and storage are one shared C# project. Desktop and browser get an Avalonia UI with MVVM; Android and iOS get a Plumix UI with Flutter-style widgets and Cubit state. The number you see on your phone comes from exactly the same code as the one on your desktop.

Native performance on mobile

NetBench runs on .NET 10 on the device itself, not in a web view and not through a remote agent. JSON is source-generated, so the app trims cleanly and starts fast, and the same profiling tools you use for backend .NET code work here too.

From a request to a pixel

Workers never touch the UI. Each result is recorded into lock-free counters and a histogram, and the screen receives one aggregated snapshot four times a second — whether the engine is doing ten requests per second or ten thousand.

  1. Virtual usersN async Tasks
  2. Channel<RequestResult>bounded, single reader
  3. AggregatorInterlocked + HDR histogram
  4. Snapshotevery 250 ms
  5. UIAvalonia or Plumix
RequestResult.cs
public readonly struct RequestResult
{
    public readonly long StartTimestampNs;
    public readonly long EndTimestampNs;
    public readonly int StatusCode;
    public readonly int BytesReceived;
    public readonly bool IsError;

    public long LatencyNs => EndTimestampNs - StartTimestampNs;
}

// Hot path: no allocation per request
_aggregator.Record(in result);
await _channel.Writer.WriteAsync(result, token);
Platforms

One codebase, two UI stacks

The domain and data layers are shared. Each platform picks its UI half at compile time — no #if in the code.

Android & iOS

Plumix — Flutter-style widgets in C#

Coming to the stores

Windows, macOS, Linux

Avalonia — XAML + MVVM

Build from source

Browser

Avalonia on WebAssembly

Build from source

Your data stays on your device

No sign-up, no analytics, no ads, no NetBench servers. Scenarios, reports and settings are stored locally, and the app only sends requests to the targets you configure.

Privacy policy

Test only what you're allowed to

NetBench generates real traffic. Point it at systems you own or have written permission to test — load against someone else's service without consent can be a denial-of-service attack.

Terms of use

Support

Found a bug or missing a feature? Open an issue on GitHub — that's where NetBench is developed in the open.

Coming soon toApp Store
Coming soon toGoogle Play