This is a well-thought-out image finder that connects Google Custom Search API with LLM-powered selection to grab the right images for your docs. The scoring system is smart, penalizing stock photos and clipart while rewarding high-res images from trusted sources. What makes it actually useful is the Obsidian integration: point it at a note and it extracts visual terms, finds images, downloads them to your attachments folder, and inserts embeds below relevant headings automatically. You can also batch process from JSON configs or just do one-off searches. The LLM selection cuts through the usual image search noise by evaluating authenticity and relevance instead of just matching keywords. Needs API keys for Google Custom Search and OpenRouter.
npx -y skills add glebis/claude-skills --skill google-image-search --agent claude-codeInstalls into .claude/skills of the current project.
Search for images using Google Custom Search API with intelligent scoring and LLM-based selection.
/opt/homebrew/bin/llmStore credentials in .env:
Google-Custom-Search-JSON-API-KEY=your_key
Google-Custom-Search-CX=your_cx
OPENROUTER_API_KEY=your_openrouter_key
Search for a single term:
python3 ~/.claude/skills/google-image-search/scripts/google_image_search.py \
--query "neural interface wearable device" \
--output-dir ./images \
--num-results 5
Process multiple queries from JSON config:
python3 ~/.claude/skills/google-image-search/scripts/google_image_search.py \
--config image_queries.json \
--output-dir ./images \
--llm-select
Create JSON config from a list of terms using LLM:
python3 ~/.claude/skills/google-image-search/scripts/google_image_search.py \
--generate-config \
--terms "AlterEgo wearable" "sEMG electrodes" "BCI headset" \
--output my_queries.json
Extract visual terms from note, find images, and insert below headings:
python3 ~/.claude/skills/google-image-search/scripts/google_image_search.py \
--enrich-note ~/Brains/brain/Research/neural-interfaces.md
This mode:
| Option | Description |
|---|---|
--query TEXT | Simple single query |
--config FILE | JSON config for batch |
--generate-config | Generate config from --terms |
--enrich-note FILE | Enrich Obsidian note |
--output-dir DIR | Where to save images |
--urls-only | Return URLs only, no download |
--llm-select | Use LLM to pick best image (default: on) |
--no-llm-select | Disable LLM selection |
--num-results N | Results per query (default: 5) |
--dry-run | Show what would be done |
Each entry supports:
{
"id": "unique-id",
"heading": "Display Heading",
"description": "Context for what image to find",
"query": "Google search query",
"numResults": 5,
"selectionCriteria": "What makes a good image",
"requiredTerms": ["must", "have"],
"optionalTerms": ["bonus", "terms"],
"excludeTerms": ["stock", "clipart"],
"preferredHosts": ["official-site.com"],
"selectionCount": 2
}
See references/api_config_reference.md for full documentation.
Images are scored based on:
After scoring, LLM picks the best image from top candidates based on:
The LLM evaluates authenticity, clarity, and relevance for technical audiences.
When in an Obsidian vault:
.obsidian folderAttachments)![[image.png|alt text]]| File | Purpose |
|---|---|
google_image_search.py | Main entry point |
api.py | Google Custom Search API |
config.py | Credentials and config handling |
download.py | Image download with magic bytes |
evaluate.py | Keyword-based scoring |
llm_select.py | LLM selection and term extraction |
obsidian.py | Vault detection and enrichment |
output.py | Markdown output generation |
juliusbrussee/caveman
mattpocock/skills
shadcn/improve
obra/superpowers
forrestchang/andrej-karpathy-skills
vercel-labs/skills