Claude-skills vercel-kv

Vercel KV (Redis-compatible key-value storage via Upstash). Use for Next.js caching, sessions, rate limiting, TTL data storage, or encountering KV_REST_API_URL errors, rate limit issues, JSON serialization errors. Provides strong consistency vs eventual consistency.

install
source · Clone the upstream repo
git clone https://github.com/secondsky/claude-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/secondsky/claude-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/vercel-kv/skills/vercel-kv" ~/.claude/skills/secondsky-claude-skills-vercel-kv && rm -rf "$T"
manifest: plugins/vercel-kv/skills/vercel-kv/SKILL.md
source content

Vercel KV (Redis-Compatible Storage)

Status: Production Ready Last Updated: 2025-12-14 Dependencies: None Latest Versions:

@vercel/kv@3.0.0


Quick Start (3 Minutes)

1. Create & Configure

# Create KV database in Vercel dashboard: Storage → Create Database → KV
vercel env pull .env.local

Creates environment variables:

  • KV_REST_API_URL
    - Your KV database URL
  • KV_REST_API_TOKEN
    - Auth token

2. Install

bun add @vercel/kv

3. Use in Your App

Next.js Server Action:

'use server';

import { kv } from '@vercel/kv';

export async function incrementViews(slug: string) {
  const views = await kv.incr(`views:${slug}`);
  return views;
}

Edge API Route:

import { kv } from '@vercel/kv';

export const runtime = 'edge';

export async function GET(request: Request) {
  const value = await kv.get('mykey');
  return Response.json({ value });
}

Critical Rules

Always Do

RuleWhy
Set TTL for temporary data
setex('key', 3600, value)
- Avoid memory leaks
Use namespaced keys
user:123:profile
not
123
- Prevents collisions
Handle null returnsNon-existent keys return
null
Use pipeline for batch opsSingle round-trip reduces latency
Serialize JSON-compatible onlyNo functions, circular references
Monitor command usageStay within free tier (30K/month)

Never Do

RuleWhy
Store sensitive data unencryptedKV not encrypted at rest by default
Forget to set TTLKeys without TTL stay forever
Use generic key names
data
,
cache
will collide
Store large values (>1MB)Use Vercel Blob instead
Use as primary databaseKV is for cache, not persistence
Commit
.env.local
Contains KV tokens

Core Operations

Set/Get with TTL:

import { kv } from '@vercel/kv';

// Set with TTL (expires in 1 hour)
await kv.setex('session:abc', 3600, { userId: 123 });

// Get value
const session = await kv.get('session:abc');

// Delete
await kv.del('session:abc');

Atomic Operations:

const views = await kv.incr('views:post:123');
const wasSet = await kv.setnx('lock:process', 'running'); // Set if not exists

Multiple Keys:

const values = await kv.mget('user:1', 'user:2', 'user:3');
await kv.mset({ 'user:1': data1, 'user:2': data2 });

Known Issues Prevention

This skill prevents 10 documented issues:

#ErrorQuick Fix
1
KV_REST_API_URL not defined
Run
vercel env pull .env.local
2
Cannot serialize BigInt
Convert to string, use plain objects
3Unexpected data returnedUse namespaced keys:
user:123:profile
4Memory grows indefinitelyUse
setex()
with TTL
5Rate limit exceededBatch operations, upgrade plan
6Value too largeUse Vercel Blob for >100KB
7TypeScript type errorsUse
kv.get<Type>()
with Zod validation
8Pipeline silent failuresCheck results array from
exec()
9Scan timeout errorsLimit count, iterate with cursor
10Session expires too earlyUse
expire()
for sliding window

See:

references/known-issues.md
for complete solutions with code examples.


Common Patterns Summary

PatternUse CaseKey API
Cache-AsideRead caching
get
→ fetch →
setex
Write-ThroughWrite consistency
setex
on write,
del
on delete
Rate LimitingAPI protection
incr
+
expire
Session ManagementUser sessions
setex
,
get
,
expire
,
del
Distributed LockConcurrency control
setnx
+
expire
+
del
LeaderboardRankings
zadd
,
zrange
,
zrevrank
PipelineBatch operations
pipeline().exec()

See:

references/common-patterns.md
for complete implementations.


Configuration

.env.local

# Created by: vercel env pull .env.local
KV_REST_API_URL="https://your-database.kv.vercel-storage.com"
KV_REST_API_TOKEN="your-token-here"

.gitignore

.env.local
.env*.local

When to Load References

ReferenceLoad When...
references/known-issues.md
Debugging KV errors, type issues, or performance problems
references/common-patterns.md
Implementing caching, sessions, rate limiting, leaderboards, or locks

Dependencies

{
  "dependencies": {
    "@vercel/kv": "^3.0.0"
  }
}

Free Tier Limits: 30,000 commands/month, 256MB storage


Official Documentation


Troubleshooting

ProblemSolution
KV_REST_API_URL not defined
Run
vercel env pull .env.local
Rate limit exceededUse
mget
/pipeline, upgrade plan
Values not expiringUse
setex()
not
set()
JSON serialization errorUse plain objects, convert BigInt to string

Token Savings: ~60% (patterns extracted to references) Error Prevention: 100% (all 10 documented issues) Ready for production!