People think an LLM client is a big thing because the SDKs are big. The wire protocol is one HTTPS POST, one JSON body, and a stream of six Server-Sent Event types. Every client on this page is the whole of it in a single file, with no SDK, and every one is measured the same way by the same harness.

The numbers come from a mock that replays a recorded exchange with its original timing, so they are about the client and not the network, and you can reproduce them without an API key.

Leaderboard

Sorted by what you ship: the artefact plus the runtime it needs. Cold start is process spawn to the first request arriving at the mock. Overhead is spawn to exit, minus the time the mock spent replaying. Medians over the runs.

#ClientArtefactRuntimeShipCold startOverheadPeak RSSToolchainPost
1rust1.4 MB2.0 MB3.3 MB1.6 ms25.74 ms2 MBrustc 1.99.1 (58cf8f9c3 2026-10-13)queued
2go5.8 MB05.8 MB1.86 ms26.42 ms6 MBgo version go1.27.2 linux/arm64queued
3csharp5.4 MB2.4 MB7.8 MB3.0 ms26.72 ms7 MBdotnet SDK 10.0.402queued
4bash3.7 KB23.7 MB23.7 MB7.12 ms56.63 ms11 MBGNU bash, version 5.2.37(1)-release (aarch64-unknown-linux-gnu)queued

Apple M4 Max under Docker, linux/arm64. Download the data (CSV). A row marked queued has a post written and dated.

The spec

Every client must do all of this, and the bench checks each point rather than trusting the code.

  1. Read the key from ANTHROPIC_API_KEY and the base URL from ANTHROPIC_BASE_URL. Nothing else from the environment.
  2. Read the prompt from stdin.
  3. POST /v1/messages with x-api-key, anthropic-version: 2023-06-01 and content-type: application/json, and a body with model, max_tokens, stream: true, messages and tools.
  4. Print each text_delta as it arrives. Buffering the whole reply fails.
  5. Declare one tool, local_time. When the stream ends with stop_reason: "tool_use", assemble the input_json_delta fragments, run the tool, send the tool_result back with the assistant turn echoed, and stream that reply too.
  6. On a non-2xx response, print the body's error.message to stderr and exit non-zero.
  7. One source file. HTTP and TLS from the platform where it has them. Where it does not, one named library, which counts towards size.

The posts

The first post publishes on Thursday 12 November 2026. Until then the repo is the post.