Files
zeekay 7aa289566d docs: the server fork is hanzoai/kv
hanzokv/valkey is archived. hanzoai/kv is the server: active, carries the zap
module and native CI, and ships kv-* as its commands.
2026-07-26 11:16:28 -07:00

2.3 KiB

LLM.md — Hanzo KV, Go client

Module: github.com/hanzokv/go/v9 · package kv

go build ./...
go test ./...      # the integration suites need a live KV on :6379

The vocabulary is kv

We do not use Redis. The client says so end to end:

package kv — kv.NewClient, kv.Options, kv.Nil, kv.UniversalClient
errors "kv: …"
URL scheme kv://, kvs://, unix:// — redis:// does not parse
companions extra/kv{otel,cmd,prometheus,census}
env KV_VERSION, KV_ENDPOINTS_CONFIG_PATH

ParseURL accepting only kv:// fails closed by design. A stale KV_URL=redis://… stops a service that validates it and silently degrades one that does not. No alias, no dual-accept.

Two spellings stay, and neither is branding: RediSearch names a specific external module the FT.* commands map to, and StoreDist matches a case-insensitive search for "redis" by accident — sto-reDis-t.

None of this touches the wire. RESP commands are GET/SET/HSET; the word never appears in the protocol. The only server-visible spellings were the ParseURL scheme, which we choose, and the CLIENT SETINFO lib-name label, which the server merely records.

One of each thing in the org

repo is
hanzokv/go this client
hanzokv/js the TypeScript client — npm @hanzo/kv
hanzokv/mock the test mock — typed against this client, so it moves in lockstep
hanzokv/lock distributed locks — its adapter is typed against this client too
hanzoai/kv the server fork — Valkey-based, kv-cli is the first-party command

Named for the language or the concern; the org supplies the product noun. A repo called kv-go under hanzokv would say it twice. Same convention as hanzo-ds.

Versioning

Always x.y.z → x.y.z+1. This module stays v9 forever — breaking changes are minor bumps, so there is no /v10 import churn.

v9.21.1 is the floor for the module path and v9.22.0 for the package rename. Anything below declares an older path or the old package name, and Go rejects a module whose declared path does not match the requested one.

extra/* are separate modules with their own tags (extra/kvotel/v9.22.0) and carry replace directives to the parent for local work, so a release is the core tag plus four extras.