Back to skills
SkillHub ClubShip Full StackFull Stack
yves-web-search
Imported from https://github.com/openclaw/skills.
Packaged view
This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.
Stars
3,070
Hot score
99
Updated
March 20, 2026
Overall rating
C4.0
Composite score
4.0
Best-practice grade
F36.0
Install command
npx @skill-hub/cli install openclaw-skills-yves-web-search
Repository
openclaw/skills
Skill path: skills/flashery/yves-web-search
Imported from https://github.com/openclaw/skills.
Open repositoryBest for
Primary workflow: Ship Full Stack.
Technical facets: Full Stack.
Target audience: everyone.
License: Unknown.
Original source
Catalog source: SkillHub Club.
Repository owner: openclaw.
This is still a mirrored public skill entry. Review the repository before installing into production workflows.
What it helps with
- Install yves-web-search into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
- Review https://github.com/openclaw/skills before adding yves-web-search to shared team environments
- Use yves-web-search for development workflows
Works across
Claude CodeCodex CLIGemini CLIOpenCode
Favorites: 0.
Sub-skills: 0.
Aggregator: No.
Original source / Raw SKILL.md
---
name: web-search
description: Search the web and fetch web pages. Use when user wants to look up information, find answers, or search for anything online. Supports multiple free methods: Jina AI reader, DuckDuckGo Lite, and Python ddgs fallback. No API keys required for basic use.
metadata:
{
"openclaw": {
"emoji": "π",
"homepage": "https://github.com/openclaw/openclaw",
"requires": {}
}
}
---
# Web Search Skill
Comprehensive web search and content extraction β free, no API keys required.
## Quick Start
**Just want to search?** Use DuckDuckGo Lite:
```
web_fetch url="https://lite.duckduckgo.com/lite/?q=YOUR+QUERY"
```
**Want full page content?** Use Jina Reader:
```
web_fetch url="https://r.jina.ai/http://TARGET_URL"
```
---
## Method 1: Jina AI Reader (Free - Recommended for Content)
Extract full page content using Jina's free reader API.
### Read a URL
```
web_fetch url="https://r.jina.ai/http://example.com"
```
### Search the Web
```
web_fetch url="https://r.jina.ai/http://duckduckgo.com/?q=YOUR+QUERY"
```
**Examples:**
| Task | Command |
|------|---------|
| Get Next.js docs | `web_fetch url="https://r.jina.ai/http://nextjs.org"` |
| Get React docs | `web_fetch url="https://r.jina.ai/http://react.dev"` |
| Get Python docs | `web_fetch url="https://r.jina.ai/http://docs.python.org"` |
### Advanced Jina Reader (with API Key)
For advanced features, get a free API key from [jina.ai/reader](https://jina.ai/reader):
```bash
export JINA_API_KEY="jina_..."
```
Then use the bundled script:
```
{baseDir}/scripts/reader.sh "https://example.com"
{baseDir}/scripts/reader.sh --mode search "AI news 2025"
{baseDir}/scripts/reader.sh --mode ground "OpenAI founded 2015"
```
Options: `--mode`, `--selector`, `--remove`, `--format`, `--json`
---
## Method 2: DuckDuckGo Lite (Free - Recommended for Search)
Search without any API key using DuckDuckGo Lite.
### Basic Search
```
web_fetch url="https://lite.duckduckgo.com/lite/?q=YOUR+QUERY"
```
### Regional Search
```
web_fetch url="https://lite.duckduckgo.com/lite/?q=QUERY&kl=us-en"
```
Regions: `au-en`, `us-en`, `uk-en`, `de-de`, `fr-fr`
### Search Tips
- Use `+` for spaces: `python+tutorial`
- Use quotes for exact phrases: `%22exact+phrase%22`
- Skip first 1-2 results (ads)
---
## Method 3: Python ddgs (Fallback)
If web_fetch is blocked, use Python's `ddgs` package:
```bash
pip install ddgs
```
```python
from ddgs import DDGS
ddgs = DDGS()
results = ddgs.text("search query", max_results=5)
for r in results:
print(f"{r['title']}: {r['url']}")
```
---
## Workflow: Search then Fetch
1. **Search** β DDG Lite to find relevant URLs
2. **Pick** β Identify best result(s)
3. **Fetch** β Jina Reader to extract full content
Example:
```
# Step 1: Find info about Next.js auth
web_fetch url="https://lite.duckduckgo.com/lite/?q=nextjs+authentication+docs"
# Step 2: Fetch the official docs
web_fetch url="https://r.jina.ai/http://nextjs.org/docs/app/..."
```
---
## Quick Reference
| Need | Method | Command |
|------|--------|---------|
| Find URLs | DDG Lite | `?q=search+terms` |
| Get page content | Jina Reader | `r.jina.ai/http://URL` |
| Advanced extraction | Jina API | `--mode search --json` |
| Python fallback | ddgs | `ddgs.text()` |
| Browser (if available) | Headless | `browser action=navigate` |
---
## Limitations
- Google search blocked (captcha)
- No date filtering via DDG Lite
- Jina free tier has rate limits
---
## Skill Companion Files
> Additional files collected from the skill directory layout.
### _meta.json
```json
{
"owner": "flashery",
"slug": "yves-web-search",
"displayName": "Yves Web Search",
"latest": {
"version": "1.0.1",
"publishedAt": 1771607794652,
"commit": "https://github.com/openclaw/skills/commit/5d56e6410767923122b151a0347e24da6d74019e"
},
"history": []
}
```
### scripts/reader.sh
```bash
#!/bin/bash
# Jina Reader CLI wrapper
# Usage: ./reader.sh [--mode read|search|ground] [--format markdown|html|text|json] [--json] [--nocache] <URL|query>
#
# Modes:
# read - Extract content from URL (default)
# search - Search web and get top results with full content
# ground - Fact-check a statement
#
# Examples:
# ./reader.sh "https://example.com"
# ./reader.sh --mode search "latest AI news"
# ./reader.sh --mode ground "OpenAI was founded in 2015"
set -e
MODE="read"
FORMAT="markdown"
JSON=false
NOCACHE=""
SELECTOR=""
REMOVE=""
PROXY=""
show_help() {
cat << EOF
Jina Reader - Extract web content via Jina AI
Usage: $0 [options] <URL or query>
Options:
--mode MODE read, search, or ground (default: read)
--format FMT markdown, html, text, or screenshot (default: markdown)
--json Output raw JSON
--nocache Force fresh content
--selector CSS Extract specific element
--remove SEL Remove elements (comma-separated)
--proxy CC Country code for geo-proxy (br, us, etc.)
-h, --help Show this help
Examples:
$0 "https://example.com"
$0 --mode search "AI trends 2025"
$0 --mode ground "Tesla is worth more than Toyota"
EOF
}
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--mode)
MODE="$2"
shift 2
;;
--format)
FORMAT="$2"
shift 2
;;
--json)
JSON=true
shift
;;
--nocache)
NOCACHE="?nocache=true"
shift
;;
--selector)
SELECTOR="&selector=$(echo $2 | sed 's/ /%20/g')"
shift 2
;;
--remove)
REMOVE="&remove=$(echo $2 | sed 's/,/%2C/g')"
shift 2
;;
--proxy)
PROXY="?country=$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
TARGET="$1"
shift
;;
esac
done
if [ -z "$TARGET" ]; then
echo "Error: URL or query required"
show_help
exit 1
fi
# Get API key
API_KEY="${JINA_API_KEY:-}"
# Build URL based on mode
if [ "$MODE" = "read" ]; then
BASE_URL="https://r.jina.ai/url/$TARGET"
elif [ "$MODE" = "search" ]; then
BASE_URL="https://r.jina.ai/search$PROXY?q=$(echo "$TARGET" | sed 's/ /%20/g')"
elif [ "$MODE" = "ground" ]; then
BASE_URL="https://r.jina.ai/ground"$PROXY
# For ground mode, send as POST would be better, but use q param
TARGET="statement=$(echo "$TARGET" | sed 's/ /%20/g')"
else
echo "Error: Unknown mode: $MODE"
exit 1
fi
# Add format if not default
if [ "$FORMAT" != "markdown" ]; then
BASE_URL="$BASE_URL&format=$FORMAT"
fi
# Add selectors
BASE_URL="$BASE_URL$SELECTOR$REMOVE$NOCACHE"
# Make request
if [ -n "$API_KEY" ]; then
# Use API key for full features
curl -s -H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json" \
"$BASE_URL" | if [ "$JSON" = true ]; then
cat
else
# Extract content field if JSON
grep -o '"content":"[^"]*"' | sed 's/"content":"//;s/"$//' || cat
fi
else
# Free tier
curl -s "$BASE_URL"
fi
```
### scripts/search.py
```python
#!/usr/bin/env python3
"""
Web search using ddgs (DuckDuckGo) Python package.
Usage: python search.py "search query" [max_results]
"""
import sys
import argparse
def main():
parser = argparse.ArgumentParser(description='DuckDuckGo Search')
parser.add_argument('query', help='Search query')
parser.add_argument('--max', '-n', type=int, default=5, help='Max results')
parser.add_argument('--json', action='store_true', help='JSON output')
args = parser.parse_args()
try:
from ddgs import DDGS
except ImportError:
print("Error: ddgs not installed. Run: pip install ddgs", file=sys.stderr)
sys.exit(1)
ddgs = DDGS()
results = ddgs.text(args.query, max_results=args.max)
if args.json:
import json
print(json.dumps(list(results), indent=2))
else:
for i, r in enumerate(results, 1):
print(f"{i}. {r.get('title', 'No title')}")
print(f" {r.get('url', 'No URL')}")
if r.get('body'):
print(f" {r.get('body', '')[:200]}...")
print()
if __name__ == '__main__':
main()
```