A lightweight, public key-value store server designed as a rendezvous/bootstrap point for mesh networks, distributed applications, and general-purpose key-value storage without registration.
π Public Instance
Public instance is available at: https://rendezvous.jipok.ru
- Key limit: 100 bytes
- Value limit: 1000 bytes
- Rate limit: 17 tokens per minute (
get=1
,set/los/cas/casoc=3
) - Expire time: 2 hours (configurable, per-entry TTL)
- Max entries: 100,000
π API Usage
Note: All responses include an extra header:
X-Client-Ip
β detected public IP of the requester
Retrieve a Value
curl {CURRENT_HOST}/get/your-key
If the key exists, server returns the stored value with an extra header: X-Expires-At
(Unix timestamp).
Store or Update a Value
curl -X POST -d "your-data-here" {CURRENT_HOST}/set/your-key
You can optionally specify a TTL (up to max): ?ttl=30m
curl -X POST -d "session-token-123" "{CURRENT_HOST}/set/my-key?ttl=30m"
Load Or Store (Atomic Get-Or-Create)
curl -X POST -d "initial-value" {CURRENT_HOST}/los/unique-key
- If key does not exist β created with your value (
OK
). - If key exists β returns existing value (not overwritten).
Compare-And-Swap (CAS)
curl -X POST -d "new-value" \
-H "X-Expected-Value: old-value" \
{CURRENT_HOST}/cas/some-key
Succeeds only if current value matches X-Expected-Value
. Otherwise returns existing value with HTTP 409 Conflict.
Compare-And-Swap Or Create (CASOC)
curl -X POST -d "my-value" \
-H "X-Expected-Value: old-value" \
{CURRENT_HOST}/casoc/my-key
- If key does not exist β created.
- If key exists but value differs β returns existing value (409).
Protecting Values with Owner Secret
curl -X POST -d "protected-data" \
-H "X-Owner-Secret: my-secret" \
{CURRENT_HOST}/set/secure-key
Only clients with the same secret can update. New keys can be βclaimedβ by providing a secret on first write. (Value + secret β€ 1000 bytes)
IP-Protected Keys
# If client IP is 20.18.12.10, key will be stored as "ip/20.18.12.10/service1"
curl -X POST -d "my server instance" {CURRENT_HOST}/set/ip/service1
curl {CURRENT_HOST}/get/ip/20.18.12.10/service1
Ensures only that IP can update ip/...
keys. Server returns your public IP on success instead of "OK".
π Use Cases
- Peer Discovery: Initial peer bootstrap
- Configuration Distribution: Share small configs
- Ephemeral Data Exchange: Temporary messages or secrets
- IoT Coordination: Lightweight communication channel
- Secure Self-Identification: Publish info under IP-protected keys
π§ Self-hosted
Using prebuilt
wget https://github.com/Jipok/rendezvous/releases/latest/download/rendezvous-server
chmod +x rendezvous-server
./rendezvous-server
Using Go
git clone https://github.com/Jipok/rendezvous
cd rendezvous
go build
./rendezvous-server
π Features
- No Registration: Just use it
- Simple HTTP API: Minimal interface with GET/POST
- TTL Support: Configurable expiration per key
- Value Protection: Optional secret protection
- Ephemeral Storage: Keys expire automatically
- Rate Limited: Token bucket limiter per IP
- Zero Dependencies: single binary, no DB required
βοΈ Configuration
Flag | Default | Description |
---|---|---|
-maxKeySize | 100 | Maximum key length in bytes |
-maxValueSize | 1000 | Maximum value length in bytes (including secret) |
-maxNumKV | 100000 | Maximum number of key-value pairs |
-expireDuration | 2h | Maximum/default TTL per key |
-resetDuration | 1m | Time between rate limit resets |
-saveDuration | 30m | Interval between persistence saves |
-maxRequests | 17 | Max tokens per IP per window (SET=3 , GET=1 ) |
-port | 80 | Server listening port |
-l | 0.0.0.0 | Listen address |
-disableLocalIPWarning | false | Disable warnings for requests from localhost |
Example:
./rendezvous-server -maxValueSize 4096 -expireDuration 24h -port 9000
β οΈ Limitations
- No Encryption: Use HTTPS/TLS for security
- IPv4 Only: IP-based features work only with IPv4