Set up and run local web searches using Bright Data SERP API with the unfancy-search pipeline (query expansion, SERP retrieval, RRF reranking).
Run powerful web searches locally using Bright Data's SERP API. This skill sets up the unfancy-search pipeline — a local search engine with query expansion, multi-engine SERP retrieval, RRF reranking, deduplication, and domain clustering.
Important: This skill uses the LOCAL version only. Do not use the hosted endpoint.
git clone https://github.com/yaronbeen/unfancy-search.git
cd unfancy-search
cp .env.example .env
Edit .env with your credentials:
BRIGHT_DATA_API_TOKEN=your_brightdata_token
BRIGHT_DATA_SERP_ZONE=serp_api1
ANTHROPIC_API_KEY=your_anthropic_key # Optional: enables AI query expansion
Get your Bright Data token from: https://brightdata.com (SERP API section)
Docker (recommended):
docker compose up -d
# Server runs at http://localhost:3000
Node.js:
pnpm install
pnpm dev
# Server runs at http://localhost:3000
All requests go to http://localhost:3000:
| Endpoint | Method | Description |
|----------|--------|-------------|
| /api/search | POST | Start a search job |
| /api/search-status/{jobId} | GET | Poll for results |
| /api/baseline | POST | Trigger baseline collection |
| /api/baseline-status/{id} | GET | Poll baseline progress |
curl -X POST http://localhost:3000/api/search \
-H "Content-Type: application/json" \
-d '{"query": "your search term"}'
The response returns a jobId.
curl http://localhost:3000/api/search-status/{jobId}
Poll every 3 seconds until status is "done".
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| query | string | required | Search query |
| expand | boolean | false | Enable AI query expansion via Claude |
| research | boolean | false | Research mode (12 sub-queries for max coverage) |
| engines | string[] | all | SERP engines to use |
| geo | string | — | Geographic region filter |
| count | number | 10 | Max results (up to 10) |
| includeDomains | string[] | — | Only include results from these domains |
| excludeDomains | string[] | — | Exclude results from these domains |
expand: false): Single query, fastest, no AI costexpand: true): Claude Haiku generates 3 sub-queries for broader coverageresearch: true): 12 sub-queries for maximum coverage# Start search
JOB_ID=$(curl -s -X POST http://localhost:3000/api/search \
-H "Content-Type: application/json" \
-d '{"query": "best practices for API rate limiting"}' | jq -r '.jobId')
# Poll until done
while true; do
RESULT=$(curl -s http://localhost:3000/api/search-status/$JOB_ID)
STATUS=$(echo $RESULT | jq -r '.status')
if [ "$STATUS" = "done" ]; then
echo $RESULT | jq '.results'
break
fi
sleep 3
done
curl -X POST http://localhost:3000/api/search \
-H "Content-Type: application/json" \
-d '{
"query": "kubernetes scaling strategies",
"research": true,
"excludeDomains": ["pinterest.com", "quora.com"]
}'
To give your Claude Code agent search capabilities:
docker compose up -d in the unfancy-search directory)curl or fetch to query http://localhost:3000/api/searchResults include:
| Issue | Solution |
|-------|----------|
| Server won't start | Verify Docker is running or Node.js 18+ installed |
| No results returned | Check BRIGHT_DATA_API_TOKEN is valid and SERP API zone is active |
| Query expansion not working | Verify ANTHROPIC_API_KEY is set and valid |
| Slow responses | Disable expand mode for faster single-query searches |
| Port 3000 in use | Stop other services or modify the port in docker-compose.yml |
Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/brightdata-local-search · pinned to the source commit
# Run from your project root
git clone https://github.com/davila7/claude-code-templates.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cc17cf267132cc690dee82239b80a99ec82e4f8
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/cli-tool/components/skills/development/brightdata-local-search" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/davila7/claude-code-templates.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cc17cf267132cc690dee82239b80a99ec82e4f8
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/cli-tool/components/skills/development/brightdata-local-search" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/brightdata-local-search
Scanner static-checks@0.1.0 · commit 5cc17cf26713. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
References credentials, tokens or secret files that a skill should not need.
Evidence: [redacted]· fingerprint e9cbb0224c4a3d23
Fetches remote content at runtime, which can change after review.
Evidence: curl· fingerprint 427e4b79b1f0fc90