Automated summary
This skill provides TypeScript patterns to speed up Windsurf API calls: LRU or Redis caching, DataLoader batching, keep-alive connection pooling, and cursor-based pagination.
Strengths
- Drop-in code snippets for both in-memory (lru-cache) and distributed (ioredis) caching
- Ready-to-use DataLoader pattern with configurable maxBatchSize and scheduling window
- Includes a latency measurement wrapper and an async generator for cursor pagination
- Supplies P50/P95/P99 latency reference points per operation type to frame a baseline
Limitations
- The Instructions section is cut off (it stops at "Step 1: Establish Baseline"), so the guided procedure is incomplete
- The benchmark numbers are generic and not measured against the user's own environment
- Assumes a Windsurf SDK exposing methods like batchGet or cursor-based list that are not verified
Use it when Windsurf API calls are slow or when you need to add caching, batching, or pooling to an existing integration.
Avoid it if your bottleneck is outside the Windsurf API calls, or if you want a complete end-to-end guided optimization procedure.
Security analysis
SafeThe skill is documentation-only and uses limited allowed tools (Read, Write, Edit). It contains standard performance optimization examples involving caching, batching, connection pooling, and monitoring. No destructive commands, credential exfiltration, obfuscated payloads, or safety-disabling instructions are present; environment variables are used conventionally for API keys and Redis URLs.
No concerns found
How this analysis is madeExamples
My Windsurf API integration is slow — reads are taking over a second each. Help me establish a baseline and add caching and connection pooling to bring latency down.Add a distributed Redis cache in front of our Windsurf API client, with a 60 second TTL and a fallback to in-memory LRU cache.Refactor our Windsurf integration to batch individual get calls with DataLoader and stream list results with cursor pagination instead of loading everything at once.name: windsurf-performance-tuning description: | Optimize Windsurf API performance with caching, batching, and connection pooling. Use when experiencing slow API responses, implementing caching strategies, or optimizing request throughput for Windsurf integrations. Trigger with phrases like "windsurf performance", "optimize windsurf", "windsurf latency", "windsurf caching", "windsurf slow", "windsurf batch". allowed-tools: Read, Write, Edit version: 1.0.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io compatible-with: claude-code, codex, openclaw
Windsurf Performance Tuning
Overview
Optimize Windsurf API performance with caching, batching, and connection pooling.
Prerequisites
- Windsurf SDK installed
- Understanding of async patterns
- Redis or in-memory cache available (optional)
- Performance monitoring in place
Latency Benchmarks
| Operation | P50 | P95 | P99 | |-----------|-----|-----|-----| | Read | 50ms | 150ms | 300ms | | Write | 100ms | 250ms | 500ms | | List | 75ms | 200ms | 400ms |
Caching Strategy
Response Caching
import { LRUCache } from 'lru-cache';
const cache = new LRUCache<string, any>({
max: 1000,
ttl: 60000, // 1 minute
updateAgeOnGet: true,
});
async function cachedWindsurfRequest<T>(
key: string,
fetcher: () => Promise<T>,
ttl?: number
): Promise<T> {
const cached = cache.get(key);
if (cached) return cached as T;
const result = await fetcher();
cache.set(key, result, { ttl });
return result;
}
Redis Caching (Distributed)
import Redis from 'ioredis';
const redis = new Redis(process.env.REDIS_URL);
async function cachedWithRedis<T>(
key: string,
fetcher: () => Promise<T>,
ttlSeconds = 60
): Promise<T> {
const cached = await redis.get(key);
if (cached) return JSON.parse(cached);
const result = await fetcher();
await redis.setex(key, ttlSeconds, JSON.stringify(result));
return result;
}
Request Batching
import DataLoader from 'dataloader';
const windsurfLoader = new DataLoader<string, any>(
async (ids) => {
// Batch fetch from Windsurf
const results = await windsurfClient.batchGet(ids);
return ids.map(id => results.find(r => r.id === id) || null);
},
{
maxBatchSize: 100,
batchScheduleFn: callback => setTimeout(callback, 10),
}
);
// Usage - automatically batched
const [item1, item2, item3] = await Promise.all([
windsurfLoader.load('id-1'),
windsurfLoader.load('id-2'),
windsurfLoader.load('id-3'),
]);
Connection Optimization
import { Agent } from 'https';
// Keep-alive connection pooling
const agent = new Agent({
keepAlive: true,
maxSockets: 10,
maxFreeSockets: 5,
timeout: 30000,
});
const client = new WindsurfClient({
apiKey: process.env.WINDSURF_API_KEY!,
httpAgent: agent,
});
Pagination Optimization
async function* paginatedWindsurfList<T>(
fetcher: (cursor?: string) => Promise<{ data: T[]; nextCursor?: string }>
): AsyncGenerator<T> {
let cursor: string | undefined;
do {
const { data, nextCursor } = await fetcher(cursor);
for (const item of data) {
yield item;
}
cursor = nextCursor;
} while (cursor);
}
// Usage
for await (const item of paginatedWindsurfList(cursor =>
windsurfClient.list({ cursor, limit: 100 })
)) {
await process(item);
}
Performance Monitoring
async function measuredWindsurfCall<T>(
operation: string,
fn: () => Promise<T>
): Promise<T> {
const start = performance.now();
try {
const result = await fn();
const duration = performance.now() - start;
console.log({ operation, duration, status: 'success' });
return result;
} catch (error) {
const duration = performance.now() - start;
console.error({ operation, duration, status: 'error', error });
throw error;
}
}
Instructions
Step 1: Establish Baseline
Measure current latency for critical Windsurf operations.
Step 2: Implement Caching
Add response caching for frequently accessed data.
Step 3: Enable Batching
Use DataLoader or similar for automatic request batching.
Step 4: Optimize Connections
Configure connection pooling with keep-alive.
Output
- Reduced API latency
- Caching layer implemented
- Request batching enabled
- Connection pooling configured
Error Handling
| Issue | Cause | Solution | |-------|-------|----------| | Cache miss storm | TTL expired | Use stale-while-revalidate | | Batch timeout | Too many items | Reduce batch size | | Connection exhausted | No pooling | Configure max sockets | | Memory pressure | Cache too large | Set max cache entries |
Examples
Quick Performance Wrapper
const withPerformance = <T>(name: string, fn: () => Promise<T>) =>
measuredWindsurfCall(name, () =>
cachedWindsurfRequest(`cache:${name}`, fn)
);
Resources
Next Steps
For cost optimization, see windsurf-cost-tuning.
From the file to a first result
The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.
View the source and supporting filesThis download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.
1. Download the file
Download SKILL.mdFrom the root of a test project, save the file as .skill-downloads/windsurf-performance-tuning-mmlj2p9p/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.
Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.
mkdir -p '.skill-downloads/windsurf-performance-tuning-mmlj2p9p' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/windsurf-performance-tuning-mmlj2p9p/download' --output '.skill-downloads/windsurf-performance-tuning-mmlj2p9p/SKILL.md.part' && mv '.skill-downloads/windsurf-performance-tuning-mmlj2p9p/SKILL.md.part' '.skill-downloads/windsurf-performance-tuning-mmlj2p9p/SKILL.md'2. Check prerequisites
Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.
Tools declared by the author (check availability in your agent): Read, Write, Edit
Original excerpt: Prerequisites
- Windsurf SDK installed
- Understanding of async patterns
- Redis or in-memory cache available (optional)
- Performance monitoring in place
The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.
3. Load the skill
After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.
Claude Code
test -f '.skill-downloads/windsurf-performance-tuning-mmlj2p9p/SKILL.md' && test -s '.skill-downloads/windsurf-performance-tuning-mmlj2p9p/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/windsurf-performance-tuning' && cp -R '.skill-downloads/windsurf-performance-tuning-mmlj2p9p' '.claude/skills/windsurf-performance-tuning'Codex
test -f '.skill-downloads/windsurf-performance-tuning-mmlj2p9p/SKILL.md' && test -s '.skill-downloads/windsurf-performance-tuning-mmlj2p9p/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/windsurf-performance-tuning' && cp -R '.skill-downloads/windsurf-performance-tuning-mmlj2p9p' '.agents/skills/windsurf-performance-tuning'OpenSkills
OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.
Official OpenSkills installationopenskills install './.skill-downloads/windsurf-performance-tuning-mmlj2p9p'openskills read 'windsurf-performance-tuning-mmlj2p9p'Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.
For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.
openskills syncManual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.
4. Try a first task
Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:
Read .skill-downloads/windsurf-performance-tuning-mmlj2p9p/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.
React Hook Form Best Practices
Development
Master React Hook Form: avoid anti-patterns, manage subscriptions, and handle reset, dirty state, and controlled inputs correctly.
Emotion to Mantine Migration
Development
Migrate Emotion styled-components to Mantine components with style props and CSS modules. Use when converting .styled.tsx files or removing @emotion imports.
Scope Creep Detector
Development
Analyzes git diffs against a stated intent to detect scope creep, unrelated files, broad PRs, and oversized changes, then suggests keep, split, or justify actions.