framer-rate-limits

'Implement Framer rate limiting, backoff, and idempotency patterns.

3 Tools
framer-pack Plugin
saas packs Category

Allowed Tools

ReadWriteEdit

Provided by Plugin

framer-pack

Claude Code skill pack for Framer (18 skills)

saas packs v1.0.0
View Plugin

Installation

This skill is included in the framer-pack plugin:

/plugin install framer-pack@claude-code-plugins-plus

Click to copy

Instructions

Framer Rate Limits

Overview

Handle Framer API rate limits for Server API and plugin operations. The Server API uses WebSocket, so rate limits apply per-connection. CMS operations are limited by collection size and concurrent writes.

Rate Limit Reference

Operation Limit Notes
Server API connections 1 per site WebSocket, persistent
CMS setItems ~100 items/call Batch larger sets
CMS getItems No hard limit Returns all items
Plugin API calls Debounced Framer throttles internally
Publish ~1/minute Site publishing
Image upload Concurrent limit Via CMS image fields

Instructions

Step 1: Batch CMS Writes


async function batchSetItems(collection: any, items: any[], batchSize = 100) {
  for (let i = 0; i < items.length; i += batchSize) {
    const batch = items.slice(i, i + batchSize);
    await collection.setItems(batch);
    console.log(`Synced ${Math.min(i + batchSize, items.length)}/${items.length}`);
    if (i + batchSize < items.length) {
      await new Promise(r => setTimeout(r, 1000)); // 1s between batches
    }
  }
}

Step 2: Debounced Plugin Operations


// Debounce rapid plugin UI interactions
function debounce<T extends (...args: any[]) => any>(fn: T, ms = 300) {
  let timer: NodeJS.Timeout;
  return (...args: Parameters<T>) => {
    clearTimeout(timer);
    timer = setTimeout(() => fn(...args), ms);
  };
}

const debouncedSync = debounce(async () => {
  await syncCollection();
}, 500);

Step 3: Retry for Server API


async function withRetry<T>(fn: () => Promise<T>, maxRetries = 3): Promise<T> {
  for (let i = 0; i <= maxRetries; i++) {
    try {
      return await fn();
    } catch (err: any) {
      if (i === maxRetries) throw err;
      const delay = 1000 * Math.pow(2, i);
      console.log(`Retry ${i + 1} in ${delay}ms`);
      await new Promise(r => setTimeout(r, delay));
    }
  }
  throw new Error('Unreachable');
}

Error Handling

Error Cause Solution
WebSocket disconnected Connection timeout Reconnect with backoff
setItems slow Large batch Split into chunks of 100
Publish rate limited Too frequent Wait 60s between publishes

Resources

Next Steps

For security, see framer-security-basics.

Ready to use framer-pack?