Durable Objects
hodgef/apiker
Create and review Cloudflare Durable Objects. An agent skill from hodgef/apiker.
Cloudflare Durable Objects for stateful coordination and real-time apps.
$ npx skills add secondsky/claude-skills --skill cloudflare-durable-objects -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install secondsky/claude-skills cloudflare-durable-objects --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/secondsky/claude-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects .claude/skills/cloudflare-durable-objects && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "cloudflare-durable-objects" agent skill from https://github.com/secondsky/claude-skills/tree/main/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects into .claude/skills/cloudflare-durable-objects/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cloudflare-durable-objects", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/secondsky/claude-skills/tree/main/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objectsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add secondsky/claude-skills --skill cloudflare-durable-objects -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install secondsky/claude-skills cloudflare-durable-objects --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/secondsky/claude-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects .agents/skills/cloudflare-durable-objects && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "cloudflare-durable-objects" agent skill from https://github.com/secondsky/claude-skills/tree/main/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects into .agents/skills/cloudflare-durable-objects/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cloudflare-durable-objects", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add secondsky/claude-skills --skill cloudflare-durable-objects -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install secondsky/claude-skills cloudflare-durable-objects --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/secondsky/claude-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects .cursor/skills/cloudflare-durable-objects && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "cloudflare-durable-objects" agent skill from https://github.com/secondsky/claude-skills/tree/main/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects into .cursor/skills/cloudflare-durable-objects/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cloudflare-durable-objects", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/secondsky/claude-skills.git --path plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add secondsky/claude-skills --skill cloudflare-durable-objects -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install secondsky/claude-skills cloudflare-durable-objects --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/secondsky/claude-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects .gemini/skills/cloudflare-durable-objects && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "cloudflare-durable-objects" agent skill from https://github.com/secondsky/claude-skills/tree/main/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects into .gemini/skills/cloudflare-durable-objects/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cloudflare-durable-objects", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install secondsky/claude-skills cloudflare-durable-objectsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add secondsky/claude-skills --skill cloudflare-durable-objects -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/secondsky/claude-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects .github/skills/cloudflare-durable-objects && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "cloudflare-durable-objects" agent skill from https://github.com/secondsky/claude-skills/tree/main/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects into .github/skills/cloudflare-durable-objects/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cloudflare-durable-objects", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add secondsky/claude-skills --skill cloudflare-durable-objects -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install secondsky/claude-skills cloudflare-durable-objects --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/secondsky/claude-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects .opencode/skills/cloudflare-durable-objects && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "cloudflare-durable-objects" agent skill from https://github.com/secondsky/claude-skills/tree/main/plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects into .opencode/skills/cloudflare-durable-objects/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cloudflare-durable-objects", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
cloudflare-durable-objectsCloudflare Durable Objects for stateful coordination and real-time apps.
Cloudflare Durable Objects is an agent skill from secondsky/claude-skills. Cloudflare Durable Objects for stateful coordination and real-time apps. Use for chat, multiplayer games, WebSocket hibernation, or encountering class export, migration, alarm errors.
Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 41 other files, including scripts and reference files (for example `references/advanced-sql-patterns.md`, `references/alarms-api.md` and `references/best-practices.md`).
It sits in Backend & APIs, covering Realtime and WebSockets. It works with Cloudflare Durable Objects and Cloudflare Workers. The repository describes itself as: Production-ready skills for Claude Code CLI - Cloudflare, React, Tailwind v4, and AI integrations. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 8837836. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/, which the agent can run.
Shell commands in SKILL.md call:
npmbunbunxFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
developers.cloudflare.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Cloudflare Durable Objects loads about 5.5k tokens when it runs, and up to ~65k if it reads all its reference files. Until then it costs about 53 tokens; SKILL.md has 1,597 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from secondsky/claude-skills at commit 8837836, republished under its MIT licence (© secondsky). 1,597 words, ~5,493 tokens.
.claude/skills/cloudflare-durable-objects/SKILL.md (or your agent's skills folder). This skill also uses 40 other files; get the full folder from GitHub.Status: Production Ready ✅ Last Updated: 2025-11-25 Dependencies: cloudflare-worker-base (recommended) Latest Versions: wrangler@4.81.0+, @cloudflare/workers-types@4.20260408.0+ Official Docs: https://developers.cloudflare.com/durable-objects/
What are Durable Objects? • Quick Start • When to Load References • Class Structure • State API • WebSocket Hibernation • Alarms • RPC vs HTTP • Stubs & Routing • Migrations • Common Patterns • Critical Rules • Known Issues
Globally unique, stateful objects with single-point coordination, strong consistency (ACID), WebSocket Hibernation (thousands of connections), SQLite storage (1GB), and alarms API.
npm create cloudflare@latest my-durable-app -- \
--template=cloudflare/durable-objects-template --ts --git --deploy false
cd my-durable-app && bun install && npm run dev1. Install types:
bun add -d @cloudflare/workers-types2. Create DO class (src/counter.ts):
import { DurableObject } from 'cloudflare:workers';
export class Counter extends DurableObject {
async increment(): Promise<number> {
let value: number = (await this.ctx.storage.get('value')) || 0;
await this.ctx.storage.put('value', ++value);
return value;
}
}
export default Counter; // CRITICAL3. Configure (wrangler.jsonc):
{
"durable_objects": {
"bindings": [{ "name": "COUNTER", "class_name": "Counter" }]
},
"migrations": [
{ "tag": "v1", "new_sqlite_classes": ["Counter"] }
]
}4. Call from Worker (src/index.ts):
import { Counter } from './counter';
interface Env {
COUNTER: DurableObjectNamespace<Counter>;
}
export { Counter };
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const stub = env.COUNTER.getByName('global-counter');
return new Response(`Count: ${await stub.increment()}`);
},
};Deploy:
bunx wrangler deployUse these interactive commands for guided workflows:
/do-setup - Initialize new DO project with interactive setup wizard
/do-migrate - Interactive migration assistant
/do-debug - Step-by-step debugging workflow
/do-patterns - Pattern selection wizard
/do-optimize - Performance optimization assistant
These agents work autonomously without user interaction:
do-debugger - Automatic error detection and fixing
do-setup-assistant - Automatic project scaffolding
do-pattern-implementer - Production pattern implementation
Load immediately when user mentions:
state-api-reference.md → "storage", "sql", "database", "query", "get/put", "KV", "1GB limit"websocket-hibernation.md → "websocket", "real-time", "chat", "hibernation", "serializeAttachment"alarms-api.md → "alarms", "scheduled tasks", "cron", "periodic", "batch processing"rpc-patterns.md → "RPC", "fetch", "HTTP", "methods", "routing"rpc-metadata.md → "RpcTarget", "metadata", "DO name", "idFromName access"stubs-routing.md → "stubs", "idFromName", "newUniqueId", "location hints", "jurisdiction"migrations-guide.md → "migrations", "rename", "delete", "transfer", "schema changes"migration-cheatsheet.md → "migration quick reference", "migration types", "common migrations"common-patterns.md → "patterns", "examples", "rate limiting", "sessions", "leader election"vitest-testing.md → "test", "testing", "vitest", "unit test", "@cloudflare/vitest-pool-workers"gradual-deployments.md → "gradual", "deployment", "traffic split", "rollout", "canary"typescript-config.md → "TypeScript", "types", "tsconfig", "wrangler.jsonc", "bindings"advanced-sql-patterns.md → "CTE", "window functions", "FTS5", "full-text search", "JSON functions", "complex SQL"security-best-practices.md → "security", "authentication", "authorization", "SQL injection", "CORS", "encryption", "rate limiting"error-codes.md → "error codes", "error catalog", "specific error", "E001", "troubleshooting"top-errors.md → errors, "not working", debugging, "binding not found"Load proactively when:
common-patterns.mderror-codes.md for specific errors, then top-errors.mdwebsocket-hibernation.md before codingstate-api-reference.md for SQL/KV APIsadvanced-sql-patterns.md for CTEs, window functions, FTS5security-best-practices.md for authentication, authorization, SQL injection preventionstubs-routing.md for ID methodsvitest-testing.md for testing patternsgradual-deployments.md for rollout strategymigration-cheatsheet.md for quick referencerpc-metadata.md for RpcTarget patterntypescript-config.md for setupAll DOs extend DurableObject and MUST be exported:
import { DurableObject } from 'cloudflare:workers';
export class MyDO extends DurableObject {
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env); // Required first line
// Keep minimal - heavy work blocks hibernation
ctx.blockConcurrencyWhile(async () => {
// Load from storage before handling requests
});
}
async myMethod(): Promise<string> { // RPC method (recommended)
return 'Hello!';
}
}
export default MyDO; // CRITICAL: Must exportthis.ctx provides: storage (SQL/KV), id (unique ID), waitUntil(), acceptWebSocket()
Durable Objects provide two storage options:
SQL API (SQLite backend, recommended):
ctx.storage.sqlnew_sqlite_classes in migrationsKey-Value API (available on both backends):
ctx.storage (get/put/delete/list)Quick example:
export class Counter extends DurableObject {
sql: SqlStorage;
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
this.sql = ctx.storage.sql;
this.sql.exec('CREATE TABLE IF NOT EXISTS counts (key TEXT PRIMARY KEY, value INTEGER)');
}
async increment(): Promise<number> {
this.sql.exec('INSERT OR REPLACE INTO counts (key, value) VALUES (?, ?)', 'count', 1);
return this.sql.exec('SELECT value FROM counts WHERE key = ?', 'count').one<{value: number}>().value;
}
}Load references/state-api-reference.md for complete SQL and KV API documentation, cursor operations, transactions, parameterized queries, storage limits, and migration patterns.
Handle thousands of WebSocket connections per DO instance with automatic hibernation when idle (~10s no activity), saving duration costs. Connections stay open at the edge while DO sleeps.
CRITICAL Rules:
ctx.acceptWebSocket(server) (enables hibernation)ws.serializeAttachment(data) to persist metadata across hibernationctx.getWebSockets()ws.accept() (standard API, no hibernation)setTimeout/setInterval (prevents hibernation)Handler methods: webSocketMessage(), webSocketClose(), webSocketError()
Quick pattern:
export class ChatRoom extends DurableObject {
sessions: Map<WebSocket, any>;
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
this.sessions = new Map();
// Restore connections after hibernation
ctx.getWebSockets().forEach(ws => {
this.sessions.set(ws, ws.deserializeAttachment());
});
}
async fetch(request: Request): Promise<Response> {
const pair = new WebSocketPair();
const [client, server] = Object.values(pair);
this.ctx.acceptWebSocket(server); // ← Enables hibernation
server.serializeAttachment({ userId: 'alice' }); // ← Persists across hibernation
this.sessions.set(server, { userId: 'alice' });
return new Response(null, { status: 101, webSocket: client });
}
async webSocketMessage(ws: WebSocket, message: string): Promise<void> {
const session = this.sessions.get(ws);
// Broadcast to all
this.sessions.forEach((_, w) => w.send(message));
}
}Load references/websocket-hibernation.md for complete handler patterns, hibernation lifecycle, serializeAttachment API, connection management, broadcasting patterns, and hibernation troubleshooting.
Schedule DO to wake up at a future time for batching, cleanup, reminders, or periodic tasks.
Core API:
await ctx.storage.setAlarm(timestamp) - Schedule alarmawait ctx.storage.getAlarm() - Get current alarm time (null if not set)await ctx.storage.deleteAlarm() - Cancel alarmasync alarm(info) - Handler called when alarm firesKey Features:
Quick pattern:
export class Batcher extends DurableObject {
async addItem(item: string): Promise<void> {
await this.ctx.storage.put('items', [...existingItems, item]);
// Schedule batch processing if not already scheduled
if (await this.ctx.storage.getAlarm() === null) {
await this.ctx.storage.setAlarm(Date.now() + 10000); // 10 seconds
}
}
async alarm(info: { retryCount: number; isRetry: boolean }): Promise<void> {
const items = await this.ctx.storage.get('items');
await this.processBatch(items); // Send to API, write to DB, etc.
await this.ctx.storage.put('items', []); // Clear buffer
}
}Load references/alarms-api.md for periodic alarms pattern, retry handling, error scenarios, cleanup jobs, and batching strategies.
RPC (Recommended): Call DO methods directly like await stub.increment(). Type-safe, simple, auto-serialization. Requires compatibility_date >= 2024-04-03.
HTTP Fetch: Traditional HTTP request/response with async fetch(request) handler. Required for WebSocket upgrades.
Quick comparison:
// RPC Pattern (simpler)
export class Counter extends DurableObject {
async increment(): Promise<number> { // ← Direct method
let value = await this.ctx.storage.get<number>('count') || 0;
return ++value;
}
}
const count = await stub.increment(); // ← Direct call
// HTTP Fetch Pattern
export class Counter extends DurableObject {
async fetch(request: Request): Promise<Response> { // ← HTTP handler
const url = new URL(request.url);
if (url.pathname === '/increment') { /* ... */ }
}
}
const response = await stub.fetch('/increment', { method: 'POST' });Use RPC for: New projects, type safety, simple method calls Use HTTP Fetch for: WebSocket upgrades, complex routing, legacy code
Load references/rpc-patterns.md for complete RPC vs Fetch comparison, migration guide, error handling patterns, and method visibility control.
To interact with a Durable Object from a Worker: get an ID → create a stub → call methods.
Three ID creation methods:
idFromName(name) - Named DOs (most common): Deterministic routing to same instance globallynewUniqueId() - Random IDs: New unique instance, must store ID for future accessidFromString(idString) - Recreate from saved ID stringGetting stubs:
// Method 1: From ID
const id = env.CHAT_ROOM.idFromName('room-123');
const stub = env.CHAT_ROOM.get(id);
// Method 2: Shortcut for named DOs (recommended)
const stub = env.CHAT_ROOM.getByName('room-123');
await stub.myMethod();Geographic routing with location hints:
locationHint option when creating stub: { locationHint: 'enam' }Data residency with jurisdiction restrictions:
newUniqueId({ jurisdiction: 'eu' }) or { jurisdiction: 'fedramp' }Load references/stubs-routing.md for complete guide to ID methods, stub management, location hints, jurisdiction restrictions, use cases, best practices, and error handling patterns.
Migrations are REQUIRED when creating, renaming, deleting, or transferring DO classes between Workers.
Four migration types:
new_sqlite_classes (recommended, 1GB) or new_classes (legacy KV, 128MB)renamed_classes with from/to mapping (data preserved, bindings forward)deleted_classes (⚠️ immediate deletion, cannot undo, all storage lost)transferred_classes with from_script (moves instances to new Worker)Quick example - Create new DO with SQLite:
{
"durable_objects": {
"bindings": [{ "name": "COUNTER", "class_name": "Counter" }]
},
"migrations": [
{
"tag": "v1", // Unique identifier (append-only)
"new_sqlite_classes": ["Counter"]
}
]
}CRITICAL rules:
Load references/migrations-guide.md for complete migration patterns, rename/delete/transfer procedures, rollback strategies, and migration gotchas.
Four production-ready patterns for Cloudflare Durable Objects:
Quick example - Rate limiter:
export class RateLimiter extends DurableObject {
async checkLimit(userId: string, limit: number, window: number): Promise<boolean> {
const requests = await this.ctx.storage.get<number[]>(`rate:${userId}`) || [];
const validRequests = requests.filter(t => Date.now() - t < window);
if (validRequests.length >= limit) return false;
validRequests.push(Date.now());
await this.ctx.storage.put(`rate:${userId}`, validRequests);
return true;
}
}Load references/common-patterns.md for complete implementations of all 4 patterns with full code examples, SQL schemas, alarm usage, error handling, and best practices.
✅ Always:
export default MyDOsuper(ctx, env) first in constructornew_sqlite_classes in migrations (1GB vs 128MB KV)ctx.acceptWebSocket() for hibernation (not ws.accept())sql.exec('... WHERE id = ?', id)blockConcurrencyWhile()❌ Never:
This skill prevents 15+ documented issues. Top 3 most critical:
Error: "binding not found" | Why: DO class not exported
Fix: export default MyDO;
Error: "migrations required" | Why: Created DO without migration entry
Fix: Add { "tag": "v1", "new_sqlite_classes": ["MyDO"] } to migrations
Error: DO never hibernates, high charges | Why: setTimeout prevents hibernation
Fix: Use await ctx.storage.setAlarm(Date.now() + 1000) instead
12 more issues covered: Wrong migration type, constructor overhead, in-memory state lost, outgoing WebSocket no hibernation, global uniqueness confusion, partial deleteAll, binding mismatch, state size exceeded, migration not atomic, location hint ignored, alarm retry failures, fetch blocks hibernation.
Load references/top-errors.md for complete error catalog with all 15+ issues, detailed prevention strategies, debugging steps, and resolution patterns.
Configure wrangler.jsonc with DO bindings and migrations, set up TypeScript types with proper exports.
Load references/typescript-config.md for: wrangler.jsonc structure, TypeScript types, Env interface, tsconfig.json, common type issues
Official Docs: https://developers.cloudflare.com/durable-objects/
references/top-errors.md for common problems or check templates/ for working examples© secondsky, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 40 other files (scripts, references) in plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects of secondsky/claude-skills.
Open the folder on GitHubat commit 8837836
Cloudflare Durable Objects next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Cloudflare Durable Objects this skillsecondsky/claude-skills | 227 | — | ~5.5k | Automated safety check: Pass | MIT | |
| Durable Objectshodgef/apiker | 127 | 4 repos | ~1.5k | Automated safety check: Pass | MIT | |
| Cloudflare WorkersEpicenterHQ/epicenter | 4.8k | — | ~576 | Automated safety check: Pass | Custom licence | |
| Durable Objectscloudflare/skills | 3k | 2 repos | ~1.5k | Automated safety check: Pass | Apache-2.0 | |
| Sharehtml Collaborationjonesphillip/sharehtml | 132 | — | ~902 | Automated safety check: Pass | Apache-2.0 | |
| Lunoraanolilab/lunora | 283 | — | ~2.7k | Automated safety check: Pass | Custom licence |
hodgef/apiker
Create and review Cloudflare Durable Objects. An agent skill from hodgef/apiker.
EpicenterHQ/epicenter
Cloudflare Workers patterns for Worker runtime APIs, Durable Objects, KV, R2, D1, Queues, WebSockets, streaming responses, bindings, wrangler configuration, and deployment limits.
cloudflare/skills
Build, debug, or review Cloudflare Durable Objects code for persistent state and coordination.
jonesphillip/sharehtml
A skill your agent uses when a user wants to deploy, update, diff, pull, or review feedback on documents managed with the sharehtml CLI.
anolilab/lunora
Routes general Lunora requests to the right project skill. An agent skill from anolilab/lunora.
danieljvdm/effect-cf
Build, review, or operate Cloudflare Workers, Durable Objects, and Sandbox SDK applications with Wrangler.
secondsky/claude-skills
TanStack AI (alpha) provider-agnostic type-safe chat with streaming for OpenAI, Anthropic, Gemini, Ollama.
secondsky/claude-skills
AutoAnimate (@formkit/auto-animate) zero-config animations for React.
secondsky/claude-skills
MUI Base UI unstyled React components with Floating UI. An agent skill from secondsky/claude-skills.
secondsky/claude-skills
This skill should be used when the user asks to "upload images to Cloudflare", "implement direct creator upload", "configure image transformations", "optimize WebP/AVIF", "create image variants"…
secondsky/claude-skills
Deploy Next.js to Cloudflare Workers via the OpenNext adapter (@opennextjs/cloudflare).
secondsky/claude-skills
Cloudflare Sandboxes SDK for secure code execution in Linux containers at edge.
Categories
Cloudflare Durable Objects for stateful coordination and real-time apps. Cloudflare Durable Objects is an agent skill from secondsky/claude-skills. Cloudflare Durable Objects for stateful coordination and real-time apps.
Cloudflare Durable Objects fits situations like: multiplayer games; webSocket hibernation; encountering class export.
Run `npx skills add secondsky/claude-skills --skill cloudflare-durable-objects -a claude-code`. Or copy the skill folder (plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects in secondsky/claude-skills) into .claude/skills/cloudflare-durable-objects in your project. Claude Code loads it when a task matches its description.
Run `npx skills add secondsky/claude-skills --skill cloudflare-durable-objects -a codex`. Or copy the skill folder (plugins/cloudflare-durable-objects/skills/cloudflare-durable-objects in secondsky/claude-skills) into .agents/skills/cloudflare-durable-objects in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add secondsky/claude-skills --skill cloudflare-durable-objects -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/cloudflare-durable-objects, .gemini/skills/cloudflare-durable-objects, .github/skills/cloudflare-durable-objects and .opencode/skills/cloudflare-durable-objects in your project.
Going by SKILL.md and its folder, Cloudflare Durable Objects needs the command-line tools its instructions call (npm, bun and bunx).
SKILL.md names 1 domain. As links in the text: developers.cloudflare.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Cloudflare Durable Objects is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.5k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 60k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Cloudflare Durable Objects: Durable Objects (hodgef/apiker, 127 stars), Cloudflare Workers (EpicenterHQ/epicenter, 4.8k stars), Durable Objects (cloudflare/skills, 3k stars) and Sharehtml Collaboration (jonesphillip/sharehtml, 132 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
secondsky (a GitHub user) maintains it in secondsky/claude-skills, which has 227 GitHub stars. The repository holds 169 skills in this directory. The repository was last updated on September 28, 2026.
Source: secondsky/claude-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.