Repository navigation
Service Crawl4ai
Crawl4AI is a local, token-protected web extraction API. It renders pages in a browser so Atlas services can summarize, ingest or index them. Atlas pins unclecode/crawl4ai:0.9.0. Its API is secure by default: every endpoint except GET /health requires CRAWL4AI_API_TOKEN.
- Direct URL:
http://localhost:${CRAWL4AI_PORT} - Kong URL:
http://crawl4ai.localhost:${KONG_HTTP_PORT} - Internal URL:
http://crawl4ai:11235
The Kong route exists only when CRAWL4AI_SOURCE=container. Kong adds the dashboard-user basic-auth, acl and cors plugins, and Crawl4AI still requires its bearer token. The two credentials cannot share the Authorization header. Through Kong, send the dashboard credential as Proxy-Authorization, which Kong's basic-auth reads.
Run this Bash example from the repository root with uv and the Bootstrapper dependencies installed.
Use an existing configuration for the running stack, with its credentials already generated.
The Atlas parser reads .env, or the file selected by ATLAS_ENV_FILE.
Keep that selection consistent with the running stack. Relative selections resolve from the repository root.
The selected file must exist and contain usable DASHBOARD_USERNAME, DASHBOARD_PASSWORD, CRAWL4AI_API_TOKEN and KONG_HTTP_PORT values.
All four values must be configured for this request. Missing, empty or whitespace-only values stop the example before curl. The loader preserves usable bytes and replaces inherited shell values. Repeat the setup after configuration changes.
if ! crawl4ai_values="$(PYTHONPATH=bootstrapper uv run --project bootstrapper python - <<'PYTHON'
import base64
import shlex
from core.config_parser import ConfigParser
parser = ConfigParser(root_dir=".")
if not parser.env_file_path.is_file():
raise SystemExit("The selected Atlas environment file must exist.")
values = parser.parse_env_file()
for name in ("DASHBOARD_USERNAME", "DASHBOARD_PASSWORD", "CRAWL4AI_API_TOKEN", "KONG_HTTP_PORT"):
if not values.get(name, "").strip():
raise SystemExit(f"{name} must be set in the selected Atlas environment file.")
basic = (values["DASHBOARD_USERNAME"] + ":" + values["DASHBOARD_PASSWORD"]).encode("utf-8")
exports = {
"CRAWL4AI_BASIC_AUTH": base64.b64encode(basic).decode("ascii"),
"CRAWL4AI_API_TOKEN": values["CRAWL4AI_API_TOKEN"],
"KONG_HTTP_PORT": values["KONG_HTTP_PORT"],
}
for name, value in exports.items():
print(f"export {name}={shlex.quote(value)}")
PYTHON
)"; then
exit 1
fi
eval "$crawl4ai_values"
curl -H "Proxy-Authorization: Basic $CRAWL4AI_BASIC_AUTH" \
-H "Authorization: Bearer $CRAWL4AI_API_TOKEN" \
"http://crawl4ai.localhost:${KONG_HTTP_PORT}/health"The service permits /health without bearer authentication.
This call checks the health route; it does not verify browser extraction or bearer acceptance.
-
CRAWL4AI_SOURCE=disabled|containercontrols whether the service runs. The default isdisabled. -
CRAWL4AI_IMAGE=unclecode/crawl4ai:0.9.0pins the upstream image. -
CRAWL4AI_API_TOKENis generated by./start.shand should be treated as a secret. -
CRAWL4AI_TIMEOUT_SECONDSandCRAWL4AI_MAX_CHARStune Local Deep Researcher extraction calls. The timeout must be finite and greater than zero. The character limit must be a nonnegative integer. Invalid values keep search snippets. -
CRAWL4AI_ALLOW_INTERNAL_URLS=falsemakes Crawl4AI reject a crawl URL with HTTP 400URL blocked (SSRF protection). This applies when the host islocalhostorhost.docker.internal, or resolves to a non-public address. Atlas container names resolve to private Docker addresses, so they are blocked too. Keep itfalseunless you intend to crawl internal hosts.
Local Deep Researcher uses Crawl4AI when LOCAL_DEEP_RESEARCHER_FULL_PAGE_MODE=crawl4ai. That mode sets FETCH_FULL_PAGE=true and patches the upstream fetch_raw_content() helper at container start.
- Each URL goes to one synchronous
POST /crawlcall. - The first result's markdown, cut to
CRAWL4AI_MAX_CHARS, becomesraw_content. - A failed URL returns
None, so one fetch problem does not abort the research loop. - Startup fails if this mode is set while
CRAWL4AI_SOURCEis notcontainer.
n8n receives CRAWL4AI_ENDPOINT and CRAWL4AI_API_TOKEN for HTTP Request nodes. Atlas does not add a custom n8n community node for Crawl4AI.
Support tier: experimental — Capability contract declared; no cited cold-start, workflow, or upgrade qualification run yet (evidence at v0.1.0).
| Capability | Status | Verification | Notes |
|---|---|---|---|
| Browser-backed web extraction | supported | tested | Atlas configures Crawl4AI's JavaScript-capable API and a Local Deep Researcher adapter that submits URLs and retains bounded markdown output. |
| Layered extraction-route authentication | supported | tested | The direct and internal APIs require the generated Crawl4AI bearer token, while the Kong alias adds dashboard Basic authentication and ACL; only health is public. |
| Conservative crawl isolation | supported | tested | Internal-URL access defaults off and the container is read-only with dropped capabilities, no-new-privileges, bounded processes, and ephemeral working directories. |
| Curated MCP package registration | not-supported | documented | The upstream server exposes MCP transports, but Atlas does not register them in its curated MCP package or provide transport-specific discovery. |
Crawl4AI 0.9.0 exposes MCP endpoints at /mcp/sse, /mcp/ws and /mcp/schema on the same token-protected server. Atlas does not register them in the curated MCP package.
-
401 Unauthorized: includeAuthorization: Bearer ${CRAWL4AI_API_TOKEN}. - Kong route missing: confirm
CRAWL4AI_SOURCE=containerand rerun./start.sh. - Local Deep Researcher still using snippets: set
LOCAL_DEEP_RESEARCHER_FULL_PAGE_MODE=crawl4ai, ensureCRAWL4AI_SOURCE=container, and restart the stack.
No upstream calls.
| Service | Category |
|---|---|
| kong | infra |
| n8n | agents |
| local-deep-researcher | apps |

Open the full-size diagram for a full-screen view.
No high-confidence opportunities identified.
No high-confidence opportunities identified.
No high-confidence opportunities identified.
Atlas documentation.
- 1. Overview
- 2. Quick Start
- 3. Core Concepts
- 4. Tracks
-
5. Services
- 5.1. Service Catalog
-
5.2. Service Guides
- 5.2.1. airflow
- 5.2.2. asset-baker
- 5.2.3. asset-worker
- 5.2.4. backend
- 5.2.5. backup
- 5.2.6. blender-mcp
- 5.2.7. celery
- 5.2.8. chatterbox
- 5.2.9. cloud-providers
- 5.2.10. cloudflared
- 5.2.11. comfyui
- 5.2.12. crawl4ai
- 5.2.13. doc-processor
- 5.2.14. docling
- 5.2.15. docling-lightrag-adapter
- 5.2.16. fal
- 5.2.17. globals
- 5.2.18. grafana
- 5.2.19. hermes
- 5.2.20. iceberg-rest
- 5.2.21. jenkins
- 5.2.22. jupyterhub
- 5.2.23. kong
- 5.2.24. label-studio
- 5.2.25. langfuse
- 5.2.26. lightrag
- 5.2.27. litellm
- 5.2.28. llm-graph-builder
- 5.2.29. local-deep-researcher
- 5.2.30. loki
- 5.2.31. mcp-servers
- 5.2.32. minio
- 5.2.33. mlflow
- 5.2.34. multi2vec-clip
- 5.2.35. n8n
- 5.2.36. neo4j
- 5.2.37. ollama
- 5.2.38. open-webui
- 5.2.39. openclaw
- 5.2.40. otel-collector
- 5.2.41. parakeet
- 5.2.42. prometheus
- 5.2.43. ray
- 5.2.44. redis
- 5.2.45. redpanda
- 5.2.46. searxng
- 5.2.47. spark
- 5.2.48. speaches
- 5.2.49. stt-provider
- 5.2.50. supabase
- 5.2.51. supavisor
- 5.2.52. tei-reranker
- 5.2.53. tempo
- 5.2.54. tika
- 5.2.55. trino
- 5.2.56. trueforge
- 5.2.57. tts-provider
- 5.2.58. verba
- 5.2.59. vllm-metal
- 5.2.60. weaviate
- 5.2.61. zeppelin
- 5.3. Provider And Extension Guides
- 6. Configuration
- 7. Operations
- 8. Architecture
- 9. Development
- 10. Reference