Skip to content

feat: add self-hosted FireCrawl provider - #2253

Open
bloodf wants to merge 1 commit into
decolua:masterfrom
bloodf:feat/firecrawl-selfhosted
Open

bloodf wants to merge 1 commit into
decolua:masterfrom
bloodf:feat/firecrawl-selfhosted

Conversation

@bloodf

@bloodf bloodf commented Jun 30, 2026 •

Copy link
Copy Markdown

Summary

Adds support for a self-hosted FireCrawl instance alongside the official FireCrawl cloud API.

Changes

  • Adds FIRECRAWL_BASE_URL, FIRECRAWL_API_KEY, FIRECRAWL_TIMEOUT_MS, and FIRECRAWL_DEFAULT_FORMAT env vars.
  • Adds a custom FireCrawl client configured for local/self-hosted endpoints.
  • Adds firecrawl_custom provider to route requests to the local instance.
  • Updates tests and docs.

Motivation

CortexOS runs FireCrawl locally at http://127.0.0.1:3002; 9Router needs to route scrape/extract requests to it without requiring a cloud API key.

Verification

  • Existing FireCrawl tests pass.
  • New custom-provider tests pass.
  • Manual smoke test against http://127.0.0.1:3002 succeeds.

@bloodf
bloodf marked this pull request as ready for review June 30, 2026 15:43
@bloodf
bloodf force-pushed the feat/firecrawl-selfhosted branch from 02565dd to df5fc89 Compare June 30, 2026 15:44
- Adds FIRECRAWL_BASE_URL, FIRECRAWL_API_KEY, FIRECRAWL_TIMEOUT_MS,
  and FIRECRAWL_DEFAULT_FORMAT environment variables.
- Refactors runFirecrawl to route to official cloud API or a custom
  self-hosted instance at /v2/scrape without an Authorization header.
- Registers firecrawl_custom provider in the registry (noAuth, webFetch).
- Adds unit tests covering both providers and env overrides.
- Documents self-hosted FireCrawl setup in README.
@bloodf
bloodf force-pushed the feat/firecrawl-selfhosted branch from df5fc89 to df348c4 Compare June 30, 2026 15:46
@bloodf bloodf closed this Jul 2, 2026
@bloodf
bloodf deleted the feat/firecrawl-selfhosted branch July 2, 2026 02:36
@bloodf
bloodf restored the feat/firecrawl-selfhosted branch July 2, 2026 02:36
@bloodf bloodf reopened this Jul 2, 2026
adentdk added a commit to adentdk/9router that referenced this pull request Jul 2, 2026
ClinePass is a flat \$9.99/month subscription authenticated by an API
key from Settings > API Keys in app.cline.bot (per
https://docs.cline.bot/getting-started/clinepass). The previous
authorization_code flow was misclassified — the OAuth callback
(client_type=extension) is the IDE extension flow and produces a
401 on the API, which is what issue decolua#2252 hit.

Changes:

- registry/clinepass.js: category "oauth" -> "apikey", drop
  authModes/hasOAuth/oauth block/clinepassHeaders hook, point
  display.notice at the API keys page
- executors/default.js: drop the now-dead clinepass refresh grant
  and the clinepassHeaders hook (default bearer is correct for
  an API key)
- oauth/providers.js: replace the full clinepass OAuth block with
  a one-liner flowType: "apikey" entry
- oauth/constants/oauth.js: drop CLINEPASS_CONFIG and the
  CLINEPASS enum value
- oauth/[provider]/[action]/route.js: remove clinepass from
  noPkceExchangeProviders

Closes decolua#2253 (no separate OAuth flow needed)

Co-Authored-By: Claude <noreply@anthropic.com>
adentdk added a commit to adentdk/9router that referenced this pull request Jul 3, 2026
ClinePass is a flat \$9.99/month subscription authenticated by an API
key from Settings > API Keys in app.cline.bot (per
https://docs.cline.bot/getting-started/clinepass). The previous
authorization_code flow was misclassified — the OAuth callback
(client_type=extension) is the IDE extension flow and produces a
401 on the API, which is what issue decolua#2252 hit.

Changes:

- registry/clinepass.js: category "oauth" -> "apikey", drop
  authModes/hasOAuth/oauth block/clinepassHeaders hook, point
  display.notice at the API keys page
- executors/default.js: drop the now-dead clinepass refresh grant
  and the clinepassHeaders hook (default bearer is correct for
  an API key)
- oauth/providers.js: replace the full clinepass OAuth block with
  a one-liner flowType: "apikey" entry
- oauth/constants/oauth.js: drop CLINEPASS_CONFIG and the
  CLINEPASS enum value
- oauth/[provider]/[action]/route.js: remove clinepass from
  noPkceExchangeProviders

Closes decolua#2253 (no separate OAuth flow needed)

Co-Authored-By: Claude <noreply@anthropic.com>
Vanszs pushed a commit to Vanszs/VansRouter that referenced this pull request Jul 7, 2026
ClinePass is a flat \$9.99/month subscription authenticated by an API
key from Settings > API Keys in app.cline.bot (per
https://docs.cline.bot/getting-started/clinepass). The previous
authorization_code flow was misclassified — the OAuth callback
(client_type=extension) is the IDE extension flow and produces a
401 on the API, which is what issue decolua#2252 hit.

Changes:

- registry/clinepass.js: category "oauth" -> "apikey", drop
  authModes/hasOAuth/oauth block/clinepassHeaders hook, point
  display.notice at the API keys page
- executors/default.js: drop the now-dead clinepass refresh grant
  and the clinepassHeaders hook (default bearer is correct for
  an API key)
- oauth/providers.js: replace the full clinepass OAuth block with
  a one-liner flowType: "apikey" entry
- oauth/constants/oauth.js: drop CLINEPASS_CONFIG and the
  CLINEPASS enum value
- oauth/[provider]/[action]/route.js: remove clinepass from
  noPkceExchangeProviders

Closes decolua#2253 (no separate OAuth flow needed)

Co-Authored-By: Claude <noreply@anthropic.com>
Shinzzyak pushed a commit to Shinzzyak/VansRouter that referenced this pull request Sep 11, 2026
ClinePass is a flat \$9.99/month subscription authenticated by an API
key from Settings > API Keys in app.cline.bot (per
https://docs.cline.bot/getting-started/clinepass). The previous
authorization_code flow was misclassified — the OAuth callback
(client_type=extension) is the IDE extension flow and produces a
401 on the API, which is what issue decolua#2252 hit.

Changes:

- registry/clinepass.js: category "oauth" -> "apikey", drop
  authModes/hasOAuth/oauth block/clinepassHeaders hook, point
  display.notice at the API keys page
- executors/default.js: drop the now-dead clinepass refresh grant
  and the clinepassHeaders hook (default bearer is correct for
  an API key)
- oauth/providers.js: replace the full clinepass OAuth block with
  a one-liner flowType: "apikey" entry
- oauth/constants/oauth.js: drop CLINEPASS_CONFIG and the
  CLINEPASS enum value
- oauth/[provider]/[action]/route.js: remove clinepass from
  noPkceExchangeProviders

Closes decolua#2253 (no separate OAuth flow needed)

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant