Install
openclaw skills install anydocsGeneric Documentation Indexing & Search. Index any documentation site (SPA/static) and search it instantly.
openclaw skills install anydocsA powerful, reusable skill for indexing and searching ANY documentation site.
anydocs solves a real problem: accessing documentation from code or CLI. Instead of opening a browser every time, you can:
Use anydocs when you need to:
~/.anydocs/config.jsoncd /path/to/skills/anydocs
pip install -r requirements.txt
chmod +x anydocs.py
For sites like Discord that use client-side rendering, install Playwright:
pip install playwright==1.40.0
playwright install # Downloads Chromium
If Playwright is unavailable, anydocs gracefully falls back to standard HTTP fetching.
python anydocs.py config vuejs \
https://vuejs.org \
https://vuejs.org/sitemap.xml
python anydocs.py index vuejs
This discovers all pages via sitemap, scrapes content, and builds a searchable index.
python anydocs.py search "composition api" --profile vuejs
python anydocs.py search "reactivity" --profile vuejs --limit 5
python anydocs.py fetch "guide/introduction" --profile vuejs
# Add or update a profile
anydocs config <profile> <base_url> <sitemap_url> [--search-method hybrid] [--ttl-days 7]
# List configured profiles
anydocs list-profiles
# Build index for a profile
anydocs index <profile>
# Force re-index (skip cache)
anydocs index <profile> --force
# Basic keyword search
anydocs search "query" --profile discord
# Limit results
anydocs search "query" --profile discord --limit 5
# Regex search
anydocs search "^API" --profile discord --regex
# Fetch a specific page (URL or path)
anydocs fetch "https://discord.com/developers/docs/resources/webhook"
anydocs fetch "resources/webhook" --profile discord
# Show cache statistics
anydocs cache status
# Clear all cache
anydocs cache clear
# Clear specific profile's cache
anydocs cache clear --profile discord
For use in agents and scripts:
from lib.config import ConfigManager
from lib.scraper import DiscoveryEngine
from lib.indexer import SearchIndex
# Load configuration
config_mgr = ConfigManager()
config = config_mgr.get_profile("discord")
# Scrape documentation
scraper = DiscoveryEngine(config["base_url"], config["sitemap_url"])
pages = scraper.fetch_all()
# Build search index
index = SearchIndex()
index.build(pages)
# Search
results = index.search("webhooks", limit=10)
for result in results:
print(f"{result['title']} ({result['relevance_score']})")
print(f" {result['url']}")
Configuration is stored in ~/.anydocs/config.json:
{
"discord": {
"name": "discord",
"base_url": "https://discord.com/developers/docs",
"sitemap_url": "https://discord.com/developers/docs/sitemap.xml",
"search_method": "hybrid",
"cache_ttl_days": 7
},
"openclaw": {
"name": "openclaw",
"base_url": "https://docs.openclaw.ai",
"sitemap_url": "https://docs.openclaw.ai/sitemap.xml",
"search_method": "hybrid",
"cache_ttl_days": 7
}
}
anydocs search "webhooks"anydocs search "how to set up webhooks"anydocs search "^(GET|POST)" --regex~/.anydocs/cache/--force flag or clear cacheRun anydocs index <profile> first to build the index.
Check the sitemap URL. Falls back to crawling from base_url if unavailable.
This is normal for large sites. Rate limiting prevents overwhelming servers.
Run anydocs cache clear or set --ttl-days to a smaller value.
anydocs config vuejs \
https://vuejs.org \
https://vuejs.org/sitemap.xml
anydocs index vuejs
anydocs search "composition api"
anydocs config nextjs \
https://nextjs.org \
https://nextjs.org/sitemap.xml
anydocs index nextjs
anydocs search "app router" --profile nextjs
anydocs config internal \
https://docs.company.local \
https://docs.company.local/sitemap.xml
anydocs index internal --force
anydocs search "deployment" --profile internal
To add new documentation sites, run:
anydocs config <profile> <base_url> <sitemap_url>
To extend search functionality, modify lib/indexer.py.
Part of the OpenClaw system.