Skip to main content

crawldown

CI PyPI version License: MIT Python 3.10+

Crawl any website and save every page as organized Markdown files.

crawldown mirrors a website's URL structure into a local directory of .md files — perfect for archiving documentation, feeding content into RAG pipelines, or reading offline.

crawldown https://docs.example.com --output ./docs-mirror
docs-mirror/
├── index.md
├── getting-started/
│   ├── index.md
│   └── installation.md
└── api/
    ├── reference.md
    └── authentication.md

Installation

pip install crawldown

Or with uv:

uv tool install crawldown

First-time setup — crawldown uses crawl4ai under the hood, which needs a browser installed once to handle JavaScript-rendered pages:

crawl4ai-setup

Quickstart

CLI

# Crawl an entire site
crawldown https://docs.example.com --output ./output

# Limit crawl depth
crawldown https://docs.example.com --output ./output --depth 2

# Add a delay between requests (seconds)
crawldown https://docs.example.com --output ./output --delay 0.5

# Only crawl URLs matching a pattern
crawldown https://docs.example.com --output ./output --include '/docs/*'

# Skip URLs matching a pattern
crawldown https://docs.example.com --output ./output --exclude '/api/*'

# Skip robots.txt enforcement
crawldown https://docs.example.com --output ./output --no-robots

Python API

import asyncio
from crawldown import crawl

asyncio.run(crawl("https://docs.example.com", output_dir="./output"))

With options:

import asyncio
from crawldown import crawl
from crawldown.models import CrawlConfig

config = CrawlConfig(
    url="https://docs.example.com",
    output_dir="./output",
    max_depth=3,
    delay=0.5,
    respect_robots=True,
    include=["/docs/*"],   # only crawl these paths (glob)
    exclude=["/api/*"],    # skip these paths (glob)
)

asyncio.run(crawl(config))

To crawl specific subpages directly, use max_depth=0. Output paths are always anchored to the site root, so files land in the right place regardless of where the crawl starts:

config = CrawlConfig(
    url="https://example.com/privacy-policy",
    output_dir="./output",
    max_depth=0,
    # Writes to ./output/privacy-policy/index.md  ✓
)

How it works

  1. Starts at the given URL and fetches the page using crawl4ai (handles JavaScript-rendered pages).
  2. Extracts all links that stay within the same domain.
  3. Converts each page to Markdown and saves it at a path matching the URL structure.
  4. Repeats for every discovered link up to max_depth (default: unlimited).

Options

Flag Default Description
--output, -o ./crawldown-output Directory to save Markdown files
--depth, -d unlimited Max link-follow depth
--delay 0.0 Seconds to wait between requests
--include — Only crawl paths matching this glob (repeatable)
--exclude — Skip paths matching this glob (repeatable)
--no-robots off Ignore robots.txt
--version — Show version and exit

Contributing

We welcome contributions of all kinds. See CONTRIBUTING.md for how to get started.


License

MIT — see LICENSE.

Metadata

Release files for crawldown 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for crawldown 0.1.3
File Size Uploaded
crawldown-0.1.3.tar.gz 272.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for crawldown 0.1.3
File Interpreter ABI Platform
crawldown-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 282.4 kB

Release files / crawldown-0.1.3.tar.gz

Download URL crawldown-0.1.3.tar.gz
Size 272.1 kB
Tags Source
SHA-256 checksum
How to use checksums
5a5da0c9d35858c0b765951e0df6594f2cc79cf66fb98ae23b68f69319d27a45
BLAKE2b-256 checksum
How to use checksums
02f790dce6ce364928acea45e7881bd1f85520447f30639798d6de80227637fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 28, 2026.

Transparency log

Release files / crawldown-0.1.3-py3-none-any.whl

Download URL crawldown-0.1.3-py3-none-any.whl
Size 10.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9c168fab8a8a27a8fce85abffcf4c05f25b84f54ef614bcbc8633deea3987414
BLAKE2b-256 checksum
How to use checksums
fc1eeb51a0ad490fb6367f129c95b64f08eae2d0f1c7609760ec601249bbf2e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 28, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page