REDIS-COMPATIBLE · MULTI-TENANT · ~390KB BINARY

A Redis-compatible store.
Free forever, period.

64 commands, Pub/Sub, transactions and resize-stable SCAN over a public TLS endpoint at nyxkv.com:6380. Connect with any Redis client — redis-cli, redis-py, ioredis — no changes needed.

Try Free GitHub
64
Redis commands
~390KB
daemon binary
1 command
to connect any Redis client
$0
forever, no card
$ redis-cli -h nyxkv.com -p 6380 --tls -a $TOKEN
nyxkv.com:6380> SET user:1 "Alice"
OK
nyxkv.com:6380> GET user:1
"Alice"
nyxkv.com:6380> SUBSCRIBE events
# Another client:
nyxkv.com:6380> PUBLISH events "user:1 signed in"
1
Get started

Connect in 3 lines

Any Redis client library works. Always over TLS, always with a token.

$ redis-cli -h nyxkv.com -p 6380 --tls -a $TOKEN
nyxkv.com:6380> SET hello world
OK
import redis
r = redis.Redis(host="nyxkv.com", port=6380, ssl=True, password="$TOKEN")
r.set("hello", "world")
import Redis from 'ioredis';
const r = new Redis({
  host: 'nyxkv.com', port: 6380,
  tls: {}, password: process.env.TOKEN,
});
await r.set('hello', 'world');
rdb := redis.NewClient(&redis.Options{
    Addr:      "nyxkv.com:6380",
    Password:  os.Getenv("TOKEN"),
    TLSConfig: &tls.Config{},
})
rdb.Set(ctx, "hello", "world", 0)
let url = format!("rediss://:{}@nyxkv.com:6380", token);
let client = redis::Client::open(url)?;
let mut con = client.get_connection()?;
redis::cmd("SET").arg("hello").arg("world").execute(&mut con);
Step by step

Quick Start

From zero to storing data in under a minute.

1. Create an account

Sign up at dashboard.nyxkv.com/signup. Email and password — no credit card.

2. Generate a token

Open dashboard.nyxkv.com/app/keys and click Create token. Copy the value — it’s shown once.

3. Connect

$ redis-cli -h nyxkv.com -p 6380 --tls -a $TOKEN PING
PONG
$ redis-cli -h nyxkv.com -p 6380 --tls -a $TOKEN
nyxkv.com:6380> SET user:1:name "Alice"
OK
nyxkv.com:6380> INCR counter
(integer) 1
Full coverage

64 commands across 8 capabilities

Everything you reach for in a Redis-compatible store — verified against redis-py and redis-cli.

Strings
SET, GET, INCR, DECR, INCRBY, APPEND, STRLEN, SETNX, SETEX, GETSET, GETDEL, GETEX, MSET, MGET.
Lists
LPUSH, RPUSH, LPOP, RPOP, LLEN, LRANGE, LINDEX. Queues and stacks in one type.
Sets
SADD, SREM, SISMEMBER, SMEMBERS, SCARD. Unique membership in O(1).
Hashes
HSET, HGET, HDEL, HGETALL, HKEYS, HVALS, HEXISTS, HLEN. Field-value records.
Pub/Sub
SUBSCRIBE, PSUBSCRIBE, PUBLISH, UNSUBSCRIBE. Real-time fan-out between clients.
Transactions
MULTI, EXEC, DISCARD. Queue commands and run them atomically against the single writer.
Scanning & keys
SCAN, KEYS, EXISTS, TYPE, DEL, DBSIZE. Cursor-stable iteration, even across resizes.
TTL & expiration
EXPIRE, TTL, PERSIST, SETEX, GETEX. Keys auto-expire after 24h on the free tier.

All 64 commands →

Correctness

SCAN that never drops a key

A cursor-based SCAN is only useful if it keeps its promise while the keyspace changes under it. NyxKV implements Redis's reverse-binary cursor over its Robin Hood hash table, so a key present for the whole scan is returned at least once — even when writes trigger table resizes mid-iteration.

# redis-py, iterating while another client floods writes
for key in r.scan_iter(match="orig:*", count=5):
    seen.add(key)
# 100/100 runs with a concurrent writer forcing resizes: 0 keys lost
Measured, not claimed

Honest numbers vs redis-server

Head-to-head on the same box (redis-benchmark, no pipeline, TLS off for the comparison). Latency sits in the same order of magnitude as Redis; the tail is where a garbage-collected runtime shows — we publish it rather than hide it.

redis-server 8.0.2 vs nyxkv · N=50,000 SET/GET, single connection, aarch64. Full method: docs/BENCH_VS_REDIS.md.
Metricredis-servernyxkvratio
SET throughput97,276 rps59,172 rps0.61×
SET p50 latency0.263 ms0.415 ms1.58×
SET p99 latency0.687 ms1.175 ms1.71×
GET throughput92,937 rps48,263 rps0.52×
GET p50 latency0.255 ms0.519 ms2.04×
Resident memory13.3 MB63.1 MB4.75×

Where does the gap go? The hot path allocates through a conservative GC, which shows up as occasional tail-latency spikes and a larger resident set. For a free, Redis-compatible endpoint it is a trade we make on purpose — and one we keep measuring.

Tenant isolation

Multi-tenant by default

Every account has its own keyspace. Tokens are issued by the dashboard, not the protocol.

# 1. Generate a token at https://dashboard.nyxkv.com/app/keys
# 2. Pass it as the password to any Redis client

$ redis-cli -h nyxkv.com -p 6380 --tls -a $TOKEN
nyxkv.com:6380> SET mykey "my data"
OK
# Stored in your namespace. No other account can read or write it.
Durability

Persistent by default

A background snapshot is written once per second. Restarts pick up where they left off.

Background snapshots
A bg-saver writes the on-disk .ndb file every second. No request blocks on persistence.
CRC32 integrity
Every snapshot carries a CRC32 checksum. Corruption is detected on load and refused.
~1s loss window
A hard kill can lose at most one second of writes. Normal restarts are clean.
For AI agents — beta

Persistent memory for your agents

Drop-in memory for Claude Code and other agents, backed by your NyxKV token. Survives sessions, syncs across machines.

# save your token once, build the SDK, install the plugin
$ printf '%s' "$TOKEN" > ~/.nyxkv-token && cd sdk && nyx build
# then, from your agent: "pull my memory" at start, "save my memory" at the end

How Agent Memory works →

Pricing

Free forever

No Pro tier. No Enterprise tier. The free tier is the product.

Free
$0
forever
  • 1000 requests / second
  • 10,000 keys per account
  • 1 MB max value size
  • 24h TTL on every key
  • TLS encryption
  • Multi-tenant isolation
  • Pub/Sub
  • Community support
Create your account
Ecosystem

Built entirely with Nyx

Part of a self-hosting language ecosystem. Daemon binary: ~390KB.

Nyx
The language NyxKV is written in. Compiles to small native binaries with no runtime dependencies.
nyx-serve
The web framework with WebSockets, templates and sessions. Powers this site and the NyxKV dashboard.
Source on GitHub
MIT licensed. Read the code, file an issue, send a patch.