From firecrawl-pack
Execute Firecrawl production deployment checklist and rollback procedures. Use when deploying Firecrawl integrations to production, preparing for launch, or implementing go-live procedures. Trigger with phrases like "firecrawl production", "deploy firecrawl", "firecrawl go-live", "firecrawl launch checklist".
npx claudepluginhub flight505/skill-forge --plugin firecrawl-packThis skill is limited to using the following tools:
Pre-deployment validation checklist for applications using Firecrawl's scrape, crawl, map, and extract APIs. Covers credential management, crawl safety limits, error handling, 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.
Pre-deployment validation checklist for applications using Firecrawl's scrape, crawl, map, and extract APIs. Covers credential management, crawl safety limits, error handling, monitoring, and rollback.
FIRECRAWL_API_KEY in secure vault (not in code or .env)fc- and is scoped to production.env files in .gitignorecrawlUrl calls have limit parameter setmaxDepth configured to prevent unbounded crawlingincludePaths / excludePaths filters applied where appropriateset -euo pipefail
# Test production key
curl -s https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer $FIRECRAWL_API_KEY_PROD" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}' | jq '.success'
# Check credit balance
curl -s https://api.firecrawl.dev/v1/team/credits \
-H "Authorization: Bearer $FIRECRAWL_API_KEY_PROD" | jq .
import FirecrawlApp from "@mendable/firecrawl-js";
const firecrawl = new FirecrawlApp({
apiKey: process.env.FIRECRAWL_API_KEY!,
});
export async function healthCheck() {
const start = Date.now();
try {
const result = await firecrawl.scrapeUrl("https://example.com", {
formats: ["markdown"],
});
return {
status: result.success ? "healthy" : "degraded",
latencyMs: Date.now() - start,
hasContent: (result.markdown?.length || 0) > 0,
};
} catch (error: any) {
return {
status: "unhealthy",
latencyMs: Date.now() - start,
error: error.statusCode || error.message,
};
}
}
export async function productionCrawl(url: string, opts: {
maxPages: number;
paths?: string[];
timeout?: number;
}) {
// Hard credit safety — never exceed configured limit
const limit = Math.min(opts.maxPages, 500);
const job = await firecrawl.asyncCrawlUrl(url, {
limit,
maxDepth: 3,
includePaths: opts.paths,
scrapeOptions: { formats: ["markdown"], onlyMainContent: true },
});
// Poll with timeout
const deadline = Date.now() + (opts.timeout || 600000);
let pollInterval = 2000;
let status = await firecrawl.checkCrawlStatus(job.id);
while (status.status === "scraping" && Date.now() < deadline) {
await new Promise(r => setTimeout(r, pollInterval));
pollInterval = Math.min(pollInterval * 1.5, 30000);
status = await firecrawl.checkCrawlStatus(job.id);
}
if (status.status !== "completed") {
throw new Error(`Crawl ${job.id} did not complete: ${status.status}`);
}
return status;
}
set -euo pipefail
# Immediate rollback — disable Firecrawl integration
kubectl set env deployment/app FIRECRAWL_ENABLED=false
kubectl rollout restart deployment/app
# Verify rollback
curl -s https://app.example.com/health | jq '.services.firecrawl'
| Alert | Condition | Severity |
|---|---|---|
| API unreachable | Health check fails 3x | P1 |
| Credits < 1000 | Balance check | P2 |
| Error rate > 5% | 429/5xx rate | P2 |
| Crawl timeout | Job stuck > 10min | P3 |
| Auth failure | Any 401 response | P1 |
For version upgrades, see firecrawl-upgrade-migration.