# Choose an application SDK

**Applies to:** current development SDK sources. Obtain a matched source bundle and server build through [early-access support](mailto:info@simplemagic.com). These SDKs are not published to public language registries and are not installed by the server APT package.

## Supported languages

| Language | Runtime | Execution model | Additional requirements |
| --- | --- | --- | --- |
| [Go](go-client.html) | Go 1.22+ | Concurrent | Go source module |
| [Rust](rust-client.html) | Rust 1.89+ | Async Tokio | Path dependency |
| [Python](python-client.html) | Python 3.10+ | Synchronous, thread-safe | No runtime dependencies |
| [Node.js / TypeScript](node-client.html) | Node.js 22+ | Promises, AbortSignal | ESM; TypeScript declarations included |
| [C](c-client.html) | C11, Linux/macOS | Blocking | OpenSSL 3+, json-c 0.16+, pthread |
| [Java](java-client.html) | Java 21+ | Blocking, thread-safe | JNI bridge and C transport |
| [C# / .NET](csharp-client.html) | .NET 10 | Blocking, thread-safe | P/Invoke and C transport |
| [PHP](php-client.html) | 64-bit PHP 8.2+ | Blocking | FFI enabled and C transport |

Java, .NET, and PHP require the shared `libsmkv` library; they are not standalone pure-language clients. Native binaries must match the application's OS and architecture. The native batch has been tested on macOS arm64; Linux is a build target but has not yet been qualified. Windows is not supported by the native batch.

## Shared operations

The new clients support binary get/put/delete, typed tables, projections, atomic column updates, TTL, explicit replica reads, management-based cluster routing, and optional verified TLS/authentication. Rust, Python, and Node have bounded connection pools. Each C-based handle serializes one persistent connection; use a bounded application pool of handles for concurrency.

All clients preserve signed int64 columns. Node uses `bigint`; Java uses `Long`; .NET uses `long`; PHP requires 64-bit integers and a `Bytes` wrapper for binary columns. A missing record is an error, distinct from a successful empty value.

For puts, omitted TTL means no expiry. For column updates, omitted TTL preserves the existing expiry. Zero expires immediately. Default writes do not request a disk sync. Local sync, replica acknowledgment, and durable replica acknowledgment are separate options.

## Connect safely

A direct client takes a **data endpoint**, normally port 7379. A cluster client takes **management seeds**, normally port 7381, then discovers data endpoints. Every advertised endpoint must be reachable from the application. Replica reads are explicitly requested and may be stale.

TLS and token authentication are optional and independent. Data and management security must be configured separately. Verified TLS never automatically downgrades to plaintext. See [security configuration](security.html) for server profiles; each SDK guide explains its client options.

## Handle uncertain writes

Inspect the SDK's outcome-unknown indicator before retrying a failed mutation. A timeout or broken connection after sending starts can mean the write completed. Reconcile application state instead of blindly replaying it.

The new SDKs automatically retry only explicit WrongOwner refusals, within the operation deadline. Go additionally supports bounded transient read retries. Do not assume identical retry behavior across languages.

## Initial release limits

The seven new SDKs do not yet include scans or batch operations. Use the Go SDK or operational tools for supported scans. Python and the C-based clients have no async API. Python/native DNS resolution can outlive an operation deadline; numeric endpoints avoid that limitation.

Local qualification covers cross-language records, typed rows, restart recovery, RF2 routing, replicas, TLS/authentication, and routing faults. It is not production load or long-duration failover qualification. Match your client limits to [server record limits](configuration.html) before using unusually large records.

## Database scope

Database-aware development builds support logical databases; published APT
0.1.0-2 does not. See [logical databases](databases.html) for client selection,
permissions, shared resource limits, backup/sync behavior and upgrade constraints.
