Connect from any language.
Eleven client SDKs talk to a node you run. Point one at your node's base URL, hand it a token if the node enforces one, and call the same small surface. This page has the download, a per-language install and a working round-trip for each, and the honest status of every connection method.
One download, all eleven languages.
The SDKs ship with the release as a single archive, downloadable from
one.semurg.io/dl and checksummed in the same
SHA256SUMS as the engine installer. Download and
verify in one line:
curl -fsSLO https://one.semurg.io/dl/clients.tar.gz && curl -fsSL https://one.semurg.io/dl/SHA256SUMS | grep clients.tar.gz | sha256sum -c - && tar xzf clients.tar.gzThat unpacks a clients/ directory with one folder per language, each with its own
README (install plus a five-line usage example), a runnable round-trip example, and offline codec tests.
The archive is rebuilt from the exact commit the engine is built from, so the SDKs always match the node.
clients/ after
you unpack it.A throwaway node in one command.
The simplest place to point an SDK is a disposable Docker node. It supplies every capability the engine needs and comes up ARMED or exits with the exact fix — it never starts degraded:
curl -fsSLO https://one.semurg.io/dl/semurg-docker.tar.gz && curl -fsSL https://one.semurg.io/dl/SHA256SUMS | grep ' semurg-docker.tar.gz$' | sha256sum -c - && tar xzf semurg-docker.tar.gz && cd semurg-docker && docker compose upWait for the green ARMED: cold-op self-test PASSED line, then the node is on host
loopback 4100 (http://127.0.0.1:4100/api/health). The /v1
data plane is token-gated; read the auto-generated token from the container:
docker exec semurg-substrate grep SEMURG_API_TOKEN /etc/semurg/semurg.env127.0.0.1:4100:4000; the container always listens on 4000 internally). A native
install from the installer instead serves on
4000. Pick whichever your node uses as the base URL below.Install, connect, round-trip.
Every SDK follows the same shape: construct a client with the node's base URL and (if needed) a token,
then call health(), status() and a read such as
histogram(). The Python shape, which the others mirror:
from semurg import Client
with Client("http://127.0.0.1:4100", token="YOUR_TOKEN") as c:
print(c.health()) # GET /api/health (open)
print(c.status()) # GET /v1/status (token-gated)
print(c.histogram(field_offset=8, buckets=8)) # POST /v1/query (a real read)
Each folder's examples/ holds that exact round-trip; it prints
ROUNDTRIP OK and exits 0. Run it against your node
(<URL> is http://127.0.0.1:4100 for the Docker node,
http://localhost:4000 for a native install; add the token as a second argument
for a token-gated node). Commands are relative to the unpacked clients/ tree.
| Language | Install | Run the round-trip example |
|---|---|---|
| Python | cd clients/python && pip install -e . | python examples/print_health.py <URL> [TOKEN] |
| Go | cd clients/go (module github.com/semurg/client-go) | go run ./examples/print_health <URL> [TOKEN] |
| Rust | cd clients/rust (path dep on this crate) | cargo run --example health <URL> [TOKEN] |
| Java | cd clients/java && javac -d out $(find src/main/java -name '*.java') | java -cp out io.semurg.examples.PrintHealth <URL> [TOKEN] |
| C# | cd clients/csharp && dotnet build Semurg.Client/Semurg.Client.csproj | dotnet run --project Examples/PrintHealth -- <URL> [TOKEN] |
| F# | cd clients/fsharp && dotnet build Semurg.Client.FSharp/Semurg.Client.FSharp.fsproj | dotnet run --project Examples/PrintHealth -- <URL> [TOKEN] |
| C++ | cd clients/cpp && make (needs libcurl) | ./build/health <URL> [TOKEN] |
| Erlang | cd clients/erlang && rebar3 compile | escript examples/health.escript <URL> [TOKEN] |
| Elixir | cd clients/elixir && mix deps.get | mix run examples/health.exs <URL> [TOKEN] |
| OCaml | cd clients/ocaml && dune build | dune exec bin/health.exe -- <URL> [TOKEN] |
| Julia | cd clients/julia && julia --project=. -e 'using Pkg; Pkg.instantiate()' | julia --project=. examples/health.jl <URL> [TOKEN] |
A node with no token provisioned is open and read-only (leave
the token off); a node with a token rejects unauthenticated /v1 calls with 401.
The idiomatic five-line usage for each language is in clients/<lang>/README.md.
One client, a pluggable transport.
Each SDK is built around one transport you can swap. The SDKs never fake a live wire: pick a method that has not fully shipped and you get the parts that are real today plus a clear, typed roadmap error for the rest.
| Method | Status | What it is |
|---|---|---|
| HTTP Live | the working default | The /api and /v1 surface, over your node's URL. The default in every SDK, and what the network round-trip uses. It already accepts batched requests. |
| WebSocket Roadmap | interface live, data wire roadmap | The node runs a socket for its live UI; the SDKs build the socket URL and join frames today. A programmatic data-stream topic is on the roadmap. |
| Semurg ATP Roadmap wire | codec live in all 11; public wire roadmap | A fast native binary protocol. The fixed-size frame codec is live and byte-identical to the node in all eleven SDKs. ATP-over-TCP runs as a local/loopback fast path in three SDKs (Rust, Elixir, Erlang); the node's ATP port is loopback-bound, so the public authed wire is on the roadmap — use HTTP over the network. |
Give it a fast disk, then confirm it.
Semurg reads and writes straight to the disk with a deep-queue direct-I/O path, so sustained disk throughput is the single axis that decides your numbers. A slow single drive produces misleadingly slow benchmarks that say nothing about the engine.
- Storage: local NVMe SSD, not network/EBS-style volumes. For real throughput, stripe several NVMe drives: RAID 0 for a throwaway benchmark box, RAID 10 when you also want redundancy. A single SATA SSD will bottleneck; good NVMe is far faster, and a stripe multiplies that again.
- Filesystem:
ext4orxfson the raw device (both are direct-I/O capable). Avoid a container overlay mount for the data dir. - Memory: enough RAM to hold your hot working set resident, plus room for the pinned arena.
Confirm the disk under your data directory is fast enough before you read any
benchmark. This measures sustained direct-I/O read throughput (install fio with
apt-get install -y fio):
fio --name=semurg-diskcheck --directory=/var/lib/semurg --rw=read --bs=1m --size=4g --direct=1 --numjobs=4 --group_reporting --runtime=20 --time_basedRead the aggregate READ: bw= line. As a rule of thumb: a low figure is a
slow single drive (expect weak benchmarks); a healthy single NVMe is much higher; a striped array
higher still. No fio? A quick floor with core tools:
dd if=/var/lib/semurg/.probe of=/dev/null bs=1M iflag=direct 2>&1 | tail -1 # after: head -c 4G /dev/urandom > /var/lib/semurg/.probeThe node also reports whether the direct-I/O path engaged in
GET /api/health (odirect:true); a slow disk still shows
true, so run the throughput check above rather than trusting that flag alone.
A concrete recipe.
If you want a fresh cloud box to try Semurg on, pick an instance whose storage is local NVMe instance store, not a network volume:
- AWS: an
i4i(ori3en) instance — these ship local NVMe SSDs. For examplei4i.2xlarge(8 vCPU, 1×1.7 TB NVMe) for a single-drive trial, or a largeri4iwith multiple NVMe drives that you stripe RAID 0/10 withmdadm, thenmkfs.ext4the array and pointSEMURG_DATA_DIRat it. - Do not put the data directory on the root EBS volume — that is a network disk and will read as a slow single drive in the self-check above.
- Then run the installer or the Docker safe-ground, and
run the
fiocheck to confirm the array is fast before benchmarking.
There is no one-click Railway/managed template today; the supported paths are the installer and the Docker image, both from one.semurg.io/dl.
Wire an assistant to a node.
Claude Code, Codex CLI and Cursor all drive a node the same way any client does — through an SDK (or the HTTP API) pointed at your node's URL with its token. There is no Semurg-specific plugin or MCP server yet; the wiring is standard env + SDK. Paste this in the tool's terminal to stand up a node and export the connection for the assistant to use:
# 1. spin up a disposable node (Docker safe-ground) curl -fsSLO https://one.semurg.io/dl/semurg-docker.tar.gz && curl -fsSL https://one.semurg.io/dl/SHA256SUMS | grep ' semurg-docker.tar.gz$' | sha256sum -c - && tar xzf semurg-docker.tar.gz cd semurg-docker && docker compose up -d # 2. export the connection (host 4100; token from the container) export SEMURG_NODE="http://127.0.0.1:4100" export SEMURG_TOKEN="$(docker exec semurg-substrate grep -oP '(?<=SEMURG_API_TOKEN=).*' /etc/semurg/semurg.env)" # 3. get an SDK in your language curl -fsSLO https://one.semurg.io/dl/clients.tar.gz && tar xzf clients.tar.gz
Then tell the assistant to use the SDK for your language against SEMURG_NODE /
SEMURG_TOKEN. The same three steps work verbatim in Claude Code, the
Codex CLI, and the Cursor terminal — each just runs the commands and reads the two env
vars. For a stricter box, use the token-gated installer node on 4000 instead of the
Docker one.