framer-rate-limits

v2026.09.24

Implement Framer rate limiting, backoff, and idempotency patterns. Use when handling rate limit errors, implementing retry logic, or optimizing API request throughput for Framer. Trigger with phrases like "framer rate limit", "framer throttling", "framer 429", "framer retry", "framer backoff".

GitHub
安装命令
npx skhub add jeremylongshore/framer-rate-limits
Markdown
SKILL.md

Framer Rate Limits

Prerequisites

Confirmed provider limits, bounded concurrency/retry policy, approved integration owner, and synthetic staging requests.

Output

Record policy version, aggregate throttles, retry/queue outcome, owner, and manual disposition without visitor data or credentials.

Examples

Simulate a throttled staging request, honor the retry bound under an opaque operation ID, and route repeated failures to review instead of replaying publish actions.

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

OperationLimitNotes
Server API connections1 per siteWebSocket, persistent
CMS setItems~100 items/callBatch larger sets
CMS getItemsNo hard limitReturns all items
Plugin API callsDebouncedFramer throttles internally
Publish~1/minuteSite publishing
Image uploadConcurrent limitVia 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

ErrorCauseSolution
WebSocket disconnectedConnection timeoutReconnect with backoff
setItems slowLarge batchSplit into chunks of 100
Publish rate limitedToo frequentWait 60s between publishes

Resources

Next Steps

For security, see framer-security-basics.

发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

2026年9月24日

分类

未分类

许可证

MIT

源路径

skills/.curated/framer-rate-limits

默认分支

main

最新提交

e5a6c3b

Tree SHA

c2dc8e8