From miro-pack
Execute Miro REST API v2 production deployment checklist and rollback procedures. Use when deploying Miro integrations to production, preparing for launch, or implementing go-live procedures for Miro apps. Trigger with phrases like "miro production", "deploy miro", "miro go-live", "miro launch checklist", "miro production ready".
npx claudepluginhub flight505/skill-forge --plugin miro-packThis skill is limited to using the following tools:
Complete checklist for deploying Miro REST API v2 integrations to production, covering OAuth configuration, rate limit readiness, monitoring, and rollback.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Complete checklist for deploying Miro REST API v2 integrations to production, covering OAuth configuration, rate limit readiness, monitoring, and rollback.
miro-security-basics)grep -r "eyJ\|Bearer " src/Retry-After header support (see miro-rate-limits)cursor parameter)application/json on all POST/PATCH requests// GET /health
async function healthCheck() {
const start = Date.now();
try {
const response = await fetch('https://api.miro.com/v2/boards?limit=1', {
headers: { 'Authorization': `Bearer ${token}` },
signal: AbortSignal.timeout(5000),
});
return {
miro: {
status: response.ok ? 'healthy' : 'degraded',
latencyMs: Date.now() - start,
rateLimitRemaining: response.headers.get('X-RateLimit-Remaining'),
},
};
} catch (error) {
return {
miro: { status: 'unhealthy', latencyMs: Date.now() - start, error: error.message },
};
}
}
class MiroCircuitBreaker {
private failures = 0;
private lastFailure = 0;
private readonly threshold = 5;
private readonly resetMs = 60000;
async execute<T>(operation: () => Promise<T>): Promise<T> {
if (this.isOpen()) {
throw new Error('Miro circuit breaker is open — API calls suspended');
}
try {
const result = await operation();
this.failures = 0;
return result;
} catch (error) {
this.failures++;
this.lastFailure = Date.now();
throw error;
}
}
private isOpen(): boolean {
if (this.failures < this.threshold) return false;
if (Date.now() - this.lastFailure > this.resetMs) {
this.failures = 0; // Half-open: allow one retry
return false;
}
return true;
}
}
# 1. Verify production token works
curl -s -w "\nHTTP %{http_code} in %{time_total}s\n" \
-H "Authorization: Bearer $MIRO_ACCESS_TOKEN_PROD" \
"https://api.miro.com/v2/boards?limit=1"
# 2. Check rate limit headroom
curl -sI -H "Authorization: Bearer $MIRO_ACCESS_TOKEN_PROD" \
"https://api.miro.com/v2/boards?limit=1" | grep -i ratelimit
# 3. Verify webhook endpoint is reachable (if using webhooks)
curl -s -o /dev/null -w "%{http_code}" https://your-app.com/webhooks/miro
# 4. Verify health check
curl -s https://your-app.com/health | jq '.miro'
| Alert | Condition | Severity | Action |
|---|---|---|---|
| Miro API Down | 5xx errors > 10/min | P1 | Enable fallback, check status.miro.com |
| Auth Failures | 401/403 > 0/min | P1 | Check token, verify scopes |
| Rate Limited | 429 errors > 5/min | P2 | Reduce request rate, check queue config |
| High Latency | P95 > 3000ms | P2 | Check board size, enable caching |
| Health Degraded | Health check fails 3x | P2 | Investigate connectivity |
# Immediate rollback — disable Miro integration
# Option 1: Feature flag
curl -X PATCH https://config.your-app.com/flags \
-d '{"miro_enabled": false}'
# Option 2: Environment variable
# Set MIRO_ENABLED=false and restart
# Option 3: Container rollback
kubectl rollout undo deployment/miro-integration
kubectl rollout status deployment/miro-integration
miro-incident-runbook)For version upgrades, see miro-upgrade-migration.