git clone https://github.com/Augani/Kora.gitcd kora
4
Build from source
5
Build the release binary using Cargo:
6
cargo build --release
7
The first build may take a few minutes as Cargo downloads and compiles dependencies. Subsequent builds will be much faster.
8
The compiled binary will be located at ./target/release/kora-cli.
9
Start the server
10
Start Kora with default settings (localhost:6379, auto-detected worker count):
11
./target/release/kora-cli
12
You should see output similar to:
13
2026-03-10T12:00:00.000Z INFO kora_cli: Starting Kōra v0.1.0 with 4 shard-IO workers2026-03-10T12:00:00.001Z INFO kora_server::shard_io: Shard 0 bound to 127.0.0.1:63792026-03-10T12:00:00.001Z INFO kora_server::shard_io: Shard 1 bound to 127.0.0.1:63792026-03-10T12:00:00.001Z INFO kora_server::shard_io: Shard 2 bound to 127.0.0.1:63792026-03-10T12:00:00.001Z INFO kora_server::shard_io: Shard 3 bound to 127.0.0.1:6379
14
Kora uses SO_REUSEPORT to bind multiple worker threads to the same port, enabling lock-free request distribution.
15
Connect with redis-cli
16
In a new terminal, connect using the standard Redis CLI:
17
redis-cli -p 6379
18
Try basic commands
19
Once connected, try these commands:
20
String operations
127.0.0.1:6379> SET greeting "hello world"OK127.0.0.1:6379> GET greeting"hello world"127.0.0.1:6379> INCR counter(integer) 1127.0.0.1:6379> INCR counter(integer) 2
Hash operations
127.0.0.1:6379> HSET user:1 name "Augustus" city "Accra"(integer) 2127.0.0.1:6379> HGETALL user:11) "name"2) "Augustus"3) "city"4) "Accra"127.0.0.1:6379> HGET user:1 name"Augustus"
# Create a collection and insert documents127.0.0.1:6379> DOC.CREATE usersOK127.0.0.1:6379> DOC.SET users user:1 '{"name":"Augustus","age":30,"city":"Accra"}'OK127.0.0.1:6379> DOC.SET users user:2 '{"name":"Kwame","age":25,"city":"Kumasi"}'OK127.0.0.1:6379> DOC.SET users user:3 '{"name":"Ama","age":28,"city":"Accra","email":"[email protected]"}'OK# Create secondary indexes127.0.0.1:6379> DOC.CREATEINDEX users city hashOK127.0.0.1:6379> DOC.CREATEINDEX users age sortedOK# Query with WHERE clause127.0.0.1:6379> DOC.FIND users WHERE city = "Accra"1) "{\"name\":\"Augustus\",\"age\":30,\"city\":\"Accra\"}"2) "{\"name\":\"Ama\",\"age\":28,\"city\":\"Accra\",\"email\":\"[email protected]\"}"# Query with complex predicates127.0.0.1:6379> DOC.FIND users WHERE age > 25 AND city = "Accra"1) "{\"name\":\"Augustus\",\"age\":30,\"city\":\"Accra\"}"2) "{\"name\":\"Ama\",\"age\":28,\"city\":\"Accra\",\"email\":\"[email protected]\"}"# Field projection127.0.0.1:6379> DOC.GET users user:1 FIELDS name city"{\"name\":\"Augustus\",\"city\":\"Accra\"}"# Count documents127.0.0.1:6379> DOC.COUNT users WHERE age >= 25(integer) 3
You can customize Kora’s behavior with command-line flags:
# Bind to all interfaces on port 7379 with 8 workers./target/release/kora-cli --bind 0.0.0.0 --port 7379 --workers 8# Enable debug logging./target/release/kora-cli --log-level debug# With password authentication./target/release/kora-cli --password "s3cret"
You can combine embedded access with a TCP listener:
use kora_embedded::{Config, Database};let db = Database::open(Config::default());// Start TCP listener (non-blocking)db.start_listener("127.0.0.1:6379")?;// Use the database from your applicationdb.set("key", b"works from both paths");// External clients can also connect via redis-cli