firecrawl-local-dev-loop
Set up a local self-hosted Firecrawl instance using Docker to enable cost-effective development and testing.
Install
mkdir -p .claude/skills/firecrawl-local-dev-loop && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/3386" && unzip -o skill.zip -d .claude/skills/firecrawl-local-dev-loop && rm skill.zipInstalls to .claude/skills/firecrawl-local-dev-loop
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Configure Firecrawl local development with self-hosted Docker, mocking,Key capabilities
- →Set up self-hosted Firecrawl using Docker Compose
- →Configure environment-aware Firecrawl API URLs for development
- →Create unit tests with mocked Firecrawl SDK
- →Implement integration tests against a local Firecrawl instance
- →Define development scripts for Firecrawl workflows
How it works
The skill sets up a local Firecrawl instance using Docker Compose and configures the application to use this local instance during development. It also provides patterns for mocking the SDK for unit tests and running integration tests.
Inputs & outputs
When to use firecrawl-local-dev-loop
- →Set up self-hosted Firecrawl via Docker
- →Configure unit tests with mocked SDK
- →Establish integration test workflows
- →Create project structure for local scraping development
About this skill
Firecrawl Local Dev Loop
Overview
Set up a fast development workflow for Firecrawl integrations. Use self-hosted Firecrawl via Docker to avoid burning API credits during development, mock the SDK for unit tests, and run integration tests against the local instance.
Prerequisites
- Node.js 18+ with npm/pnpm
- Docker + Docker Compose (for self-hosted Firecrawl)
@mendable/firecrawl-jsinstalled
Instructions
Step 1: Project Structure
my-firecrawl-project/
├── src/
│ ├── scraper.ts # Firecrawl business logic
│ └── config.ts # Environment-aware config
├── tests/
│ ├── scraper.test.ts # Unit tests (mocked SDK)
│ └── integration.test.ts # Integration tests (real API)
├── docker-compose.yml # Self-hosted Firecrawl
├── .env.local # Dev secrets (git-ignored)
├── .env.example # Template for team
└── package.json
Step 2: Self-Hosted Firecrawl for Zero-Credit Dev
# docker-compose.yml
services:
firecrawl:
image: mendableai/firecrawl:latest
ports:
- "3002:3002"
environment:
- PORT=3002
- USE_DB_AUTHENTICATION=false
- REDIS_URL=redis://redis:6379
- NUM_WORKERS_PER_QUEUE=1
- BULL_AUTH_KEY=devonly
depends_on:
redis:
condition: service_healthy
redis:
image: redis:7-alpine
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
set -euo pipefail
# Start local Firecrawl
docker compose up -d
# Verify it's running
curl -s http://localhost:3002/health | jq .
Step 3: Environment-Aware Configuration
// src/config.ts
import FirecrawlApp from "@mendable/firecrawl-js";
export function getFirecrawl(): FirecrawlApp {
const isDev = process.env.NODE_ENV !== "production";
return new FirecrawlApp({
apiKey: process.env.FIRECRAWL_API_KEY || "fc-dev",
// Point to local Docker instance in dev
...(isDev && process.env.FIRECRAWL_API_URL
? { apiUrl: process.env.FIRECRAWL_API_URL }
: {}),
});
}
# .env.local (for development — zero API credits used)
FIRECRAWL_API_KEY=fc-localdev
FIRECRAWL_API_URL=http://localhost:3002
NODE_ENV=development
Step 4: Unit Tests with Mocked SDK
// tests/scraper.test.ts
import { describe, it, expect, vi, beforeEach } from "vitest";
// Mock the SDK
vi.mock("@mendable/firecrawl-js", () => ({
default: vi.fn().mockImplementation(() => ({
scrapeUrl: vi.fn().mockResolvedValue({
success: true,
markdown: "# Hello World\n\nSample content from mock",
metadata: { title: "Hello World", sourceURL: "https://example.com" },
}),
crawlUrl: vi.fn().mockResolvedValue({
success: true,
data: [
{
markdown: "# Page 1",
metadata: { sourceURL: "https://example.com/page1" },
},
],
}),
mapUrl: vi.fn().mockResolvedValue({
success: true,
links: ["https://example.com/a", "https://example.com/b"],
}),
})),
}));
import { scrapeAndProcess } from "../src/scraper";
describe("Scraper", () => {
it("returns cleaned markdown", async () => {
const result = await scrapeAndProcess("https://example.com");
expect(result.markdown).toContain("Hello World");
expect(result.metadata.title).toBe("Hello World");
});
});
Step 5: Integration Tests Against Local Instance
// tests/integration.test.ts
import { describe, it, expect } from "vitest";
import FirecrawlApp from "@mendable/firecrawl-js";
const FIRECRAWL_URL = process.env.FIRECRAWL_API_URL || "http://localhost:3002";
describe.skipIf(!process.env.FIRECRAWL_API_URL)("Firecrawl Integration", () => {
const firecrawl = new FirecrawlApp({
apiKey: "fc-test",
apiUrl: FIRECRAWL_URL,
});
it("scrapes a page to markdown", async () => {
const result = await firecrawl.scrapeUrl("https://example.com", {
formats: ["markdown"],
});
expect(result.success).toBe(true);
expect(result.markdown).toBeDefined();
expect(result.markdown!.length).toBeGreaterThan(50);
}, 30000);
});
Step 6: Dev Scripts
{
"scripts": {
"dev": "tsx watch src/index.ts",
"test": "vitest",
"test:watch": "vitest --watch",
"test:integration": "FIRECRAWL_API_URL=http://localhost:3002 vitest run tests/integration",
"firecrawl:up": "docker compose up -d",
"firecrawl:down": "docker compose down",
"firecrawl:logs": "docker compose logs -f firecrawl"
}
}
Output
- Self-hosted Firecrawl running on
localhost:3002 - Unit tests with mocked SDK (zero API calls)
- Integration tests against local instance
- Hot-reload dev server with
tsx watch
Error Handling
| Error | Cause | Solution |
|---|---|---|
Docker ECONNREFUSED | Container not running | docker compose up -d |
| Redis connection refused | Redis not healthy yet | Wait for healthcheck, retry |
MODULE_NOT_FOUND | Missing dependency | npm install @mendable/firecrawl-js |
| Integration test timeout | Self-hosted Firecrawl slow | Increase vitest timeout to 30s |
| Port 3002 in use | Another process | lsof -i :3002 and kill, or change port |
Examples
Quick Scrape Script for Dev
// scripts/dev-scrape.ts
import { getFirecrawl } from "../src/config";
const firecrawl = getFirecrawl();
const result = await firecrawl.scrapeUrl(process.argv[2] || "https://example.com", {
formats: ["markdown"],
});
console.log(result.markdown);
npx tsx scripts/dev-scrape.ts https://docs.firecrawl.dev
Resources
Next Steps
See firecrawl-sdk-patterns for production-ready code patterns.
When not to use it
- →When Docker containers are not running
- →When Redis is not healthy
- →When port 3002 is already in use
Prerequisites
Limitations
- →Integration tests may timeout if the self-hosted Firecrawl is slow
- →Missing dependencies can cause MODULE_NOT_FOUND errors
- →Port conflicts can prevent the local Firecrawl instance from starting
How it compares
This skill establishes a local development workflow for Firecrawl, allowing testing without consuming API credits, which differs from directly using the production Firecrawl API.
Compared to similar skills
firecrawl-local-dev-loop side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| firecrawl-local-dev-loop (this skill) | 1 | 27d | Caution | Intermediate |
| documenso-local-dev-loop | 2 | 27d | Review | Beginner |
| agent-sandbox | 1 | 6mo | No flags | Intermediate |
| makefile-dev-workflow | 0 | 6mo | Review | Beginner |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
documenso-local-dev-loop
jeremylongshore
Set up local development environment and testing workflow for Documenso. Use when configuring dev environment, setting up test workflows, or establishing rapid iteration patterns with Documenso. Trigger with phrases like "documenso local dev", "documenso development", "test documenso locally", "documenso dev environment".
agent-sandbox
ruvnet
Agent skill for sandbox - invoke with $agent-sandbox
makefile-dev-workflow
raphaelmansuy
Unified development workflow for EdgeQuake using Makefile commands. Use when starting services, running tests, or managing the full development stack (database, backend, frontend). Provides simplified alternatives to raw cargo/npm commands.
upgrade-deps
obot-platform
Upgrade dependencies and runtimes safely, run CI, and report higher-risk options.
e2e-test-service-management
raphaelmansuy
Service management for E2E testing in EdgeQuake. Start, stop, and monitor PostgreSQL, backend API, and frontend services. Includes health checks and logging utilities for interactive testing workflows.
chaos-scenario
petercort
Use when authoring, running, or reviewing chaos engineering experiments in this monorepo. Covers steady-state hypothesis, fault injection (service kill, latency, network partition, overload), result recording to CSV, and cleanup/restore. Triggers: "add chaos scenario", "new chaos test", "inject faul