Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added public/appicons/io.pilot.firecrawl.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions scripts/gen-apps.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const CAT_HUE = Object.fromEntries(CATEGORIES.map((c) => [c.id, c.hue]));
const CATMAP = {
'io.pilot.postgres': 'data', 'io.pilot.duckdb': 'data', 'io.pilot.sqlite': 'data', 'io.pilot.mysql': 'data', 'io.pilot.redis': 'data', 'io.pilot.sixtyfour': 'data', 'io.pilot.orthogonal': 'data',
'io.pilot.cosift': 'ai', 'io.telepat.ideon-free': 'ai',
'io.pilot.plainweb': 'web', 'io.pilot.otto': 'web', 'io.pilot.bowmark': 'web',
'io.pilot.plainweb': 'web', 'io.pilot.otto': 'web', 'io.pilot.bowmark': 'web', 'io.pilot.firecrawl': 'web',
'io.pilot.smol': 'infra', 'io.pilot.miren': 'infra', 'io.pilot.docker': 'infra', 'io.pilot.tldr': 'infra',
'io.pilot.aegis': 'security', 'io.pilot.didit': 'security',
'io.pilot.slipstream': 'finance', 'io.pilot.wallet': 'finance',
Expand Down Expand Up @@ -69,6 +69,7 @@ const ICON_MAP = {
'io.pilot.orthogonal': { image: 'png', fit: 'cover', bg: '#e3e6df' },
'io.pilot.agentphone': { image: 'png', fit: 'contain', bg: '#26B65A' },
'io.pilot.primitive': { image: 'png', fit: 'cover', bg: '#111110' },
'io.pilot.firecrawl': { image: 'png', fit: 'contain', bg: '#0b0b0a' },
};

function relLum(hex) {
Expand Down Expand Up @@ -96,7 +97,7 @@ function iconFor(id, hue) {
const APP_IDS = [
'io.pilot.primitive', 'io.pilot.agentphone',
'io.pilot.postgres', 'io.pilot.duckdb', 'io.pilot.sqlite', 'io.pilot.mysql', 'io.pilot.redis', 'io.pilot.sixtyfour',
'io.pilot.cosift', 'io.telepat.ideon-free', 'io.pilot.plainweb', 'io.pilot.otto',
'io.pilot.cosift', 'io.telepat.ideon-free', 'io.pilot.plainweb', 'io.pilot.otto', 'io.pilot.firecrawl',
'io.pilot.smol', 'io.pilot.miren', 'io.pilot.docker', 'io.pilot.aegis',
'io.pilot.slipstream', 'io.pilot.wallet', 'io.pilot.bowmark', 'io.pilot.orthogonal', 'io.pilot.didit', 'io.pilot.tldr',
];
Expand Down
103 changes: 102 additions & 1 deletion src/data/app-demos.json
Original file line number Diff line number Diff line change
Expand Up @@ -1045,5 +1045,106 @@
"next": [
"io.telepat.ideon-free ideon-free.help '{}'"
]
},
"io.pilot.firecrawl": {
"skill": "io.pilot.firecrawl",
"title": "Full usage demo",
"when_to_use": "When you need content from the live web: read a page as clean markdown, search the web, enumerate a site's URLs, crawl a whole domain, or extract structured data from pages.",
"metered": true,
"quickstart": {
"goal": "Read any page as clean, LLM-ready markdown",
"command": "pilotctl appstore call io.pilot.firecrawl firecrawl.scrape '{\"url\":\"https://example.com\"}'",
"expect": "{\"success\":true,\"data\":{\"markdown\":\"# Example Domain\\n\\nThis domain is for use in documentation examples...\",\"metadata\":{\"title\":\"Example Domain\",\"creditsUsed\":1}}}",
"cost": "1 credit"
},
"examples": [
{
"title": "Check your budget first (free read)",
"command": "pilotctl appstore call io.pilot.firecrawl firecrawl.balance '{}'",
"expect": "{\"credits_remaining\":1000,\"credits_seed\":1000,\"scope\":\"per-pilot-user\"}",
"cost": "0 credits (read)"
},
{
"title": "Search the web and get real content back",
"command": "pilotctl appstore call io.pilot.firecrawl firecrawl.search '{\"query\":\"open source web crawlers\",\"limit\":3}'",
"expect": "{\"success\":true,\"data\":{\"web\":[{\"url\":\"https://...\",\"title\":\"...\",\"description\":\"...\"}]},\"id\":\"019fc9b8-...\"}",
"cost": "2 credits"
},
{
"title": "Enumerate a site's URLs before paying to crawl it",
"command": "pilotctl appstore call io.pilot.firecrawl firecrawl.map '{\"url\":\"https://docs.firecrawl.dev\",\"limit\":50}'",
"expect": "{\"success\":true,\"links\":[{\"url\":\"https://docs.firecrawl.dev/...\",\"title\":\"...\"}]}",
"cost": "1 credit",
"note": "Always map before a crawl: crawl defaults to 10000 pages."
},
{
"title": "Crawl a site — async, returns a job id",
"command": "pilotctl appstore call io.pilot.firecrawl firecrawl.crawl '{\"url\":\"https://docs.firecrawl.dev\",\"limit\":10}'",
"expect": "{\"success\":true,\"id\":\"a1b2c3d4-...\",\"url\":\"https://api.firecrawl.dev/v2/crawl/a1b2c3d4-...\"}",
"cost": "20 credits",
"note": "SET limit — it defaults to 10000 pages."
},
{
"title": "Poll the crawl until it finishes (free read)",
"command": "pilotctl appstore call io.pilot.firecrawl firecrawl.crawl_status '{\"id\":\"a1b2c3d4-...\"}'",
"expect": "{\"status\":\"completed\",\"total\":10,\"completed\":10,\"creditsUsed\":10,\"data\":[{\"markdown\":\"...\",\"metadata\":{}}]}",
"cost": "0 credits (read)"
}
],
"cost": {
"unit": "Firecrawl credits",
"free_budget": "1000 credits per Pilot user",
"hard_cap_usd": 0,
"operations": [
{
"op": "scrape / map / docs_search",
"price": "1 credit",
"note": "per call"
},
{
"op": "search",
"price": "2 credits",
"note": "per query"
},
{
"op": "ask",
"price": "3 credits",
"note": "per diagnosis"
},
{
"op": "interact_create / monitor_create",
"price": "5 credits",
"note": "per session or monitor"
},
{
"op": "crawl / batch_scrape / extract",
"price": "20 credits",
"note": "charged when the job is accepted; a large crawl costs more as it runs"
},
{
"op": "agent",
"price": "50 credits",
"note": "cap it with maxCredits"
},
{
"op": "all *_status, *_errors, list and usage reads",
"price": "0 credits",
"note": "reads are free"
}
],
"worked_total": "This demo spends 24 of your 1000 credits (quickstart scrape 1 + search 2 + map 1 + crawl 20; both reads are free).",
"check_balance": "pilotctl appstore call io.pilot.firecrawl firecrawl.balance '{}'"
},
"gotchas": [
"You get 1000 credits and 2 concurrent calls. Check firecrawl.balance before a big job.",
"429 means you already have 2 calls in flight — wait, or free a slot. Browser/interact sessions hold one until stopped.",
"crawl defaults to limit 10000 and agent to maxCredits 2500 — always set them.",
"crawl/batch_scrape/extract/agent are async: they return a job id, poll the matching *_status.",
"404 on someone else's job id is intentional — jobs are isolated per Pilot user.",
"firecrawl.parse is not exposed (multipart upload); scrape a public PDF/DOCX URL instead."
],
"next": [
"io.pilot.firecrawl firecrawl.help '{}'"
]
}
}
}
Loading
Loading