A type-safe key-value store backed by Vercel Blob with edge caching and copy-on-write branch isolation.
npm install @vercel/kv2
# or
pnpm add @vercel/kv2
import { createKV } from "@vercel/kv2";
const kv = createKV({ prefix: "myapp/" });
interface User {
name: string;
email: string;
}
const users = kv.getStore<User>("users/");
await users.set("alice", { name: "Alice", email: "alice@example.com" });
const result = await users.get("alice");
if (result.exists) {
console.log((await result.value).name); // "Alice"
}
// Or use getValue() for a simpler read (returns undefined if not found)
const user = await users.getValue("alice");
console.log(user?.name); // "Alice"
// Delete, iterate keys, entries, getMany — see docs
await users.delete("alice");
| Feature | Description | Docs |
|---|---|---|
| Typed Stores | Type-safe sub-stores with automatic key prefixing | Typed Stores |
| Iteration | entries() and getMany() with bounded concurrency | Iterating and Pagination |
| Pagination | Cursor-based pagination for HTTP APIs | Iterating and Pagination |
| Optimistic Locking | Version-based conflict detection and retry | Optimistic Locking |
| Metadata | Typed per-entry metadata, available without loading values | Metadata |
| Schema & Trees | Hierarchical data with batched tree loading | Schema and Trees |
| Indexes | Secondary indexes with unique constraints | Indexes |
| Edge Caching | Write-through cache with tag invalidation | Caching |
| Streaming | Large values streamed without buffering | Streaming |
| Copy-on-Write | Preview branches inherit from production | Copy-on-Write Branches |
| CLI Explorer | Interactive KV store explorer for debugging | CLI |
BLOB_READ_WRITE_TOKEN=vercel_blob_...
See Getting Started for full environment setup.
ISC