agentleFS
jeanpfsjeanpfs/stock-images/SKILL.md

stock-images

Skill4 starsChanged 30 days agoMITView on GitHub

Search and download stock photos from Pexels, Unsplash, and Pixabay for projects, landing pages, UI mockups, and content. Use when users explicitly ask to find stock photos, need a hero/profile/content image, or want to download a selected stock image.

1 other project uses a version of this.

Adopted by

Most recently taken up by

  • Other versions1 project uses a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 1

    1. dongnguyenvie/bashcut-agent-kit★ 6same name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

The file

Show its rules and text

We split this skill into the rules it gives an agent

25 rules. About 0 are common, 21 are distinctive, and 4 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈21

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    NEVER display API keys in your output

    line 8
  2. Distinctive:

    NEVER echo full curl commands that contain API keys

    line 9
  3. Distinctive:

    Only download from allowed domains:

    line 11
  4. Distinctive:

    All URLs MUST use HTTPS

    line 15
  5. Distinctive:

    After downloading, check file size — alert if > 10MB

    line 16
  6. Distinctive:

    Do NOT activate this skill when:

    line 21
  7. Distinctive:

    Before searching, check if API keys are configured:

    line 28
  8. Distinctive:

    If the file does not exist: guide the user interactively through setup:

    line 34
  9. Distinctive:

    Ask which providers they want to use (Pexels, Unsplash, Pixabay — all free)

    line 35
  10. Distinctive:

    NEVER display the keys back after saving

    line 41
  11. Very specific:

    If permissions are not 600: warn the user and offer to fix with chmod 600 ~/.config/stock-images/keys.json.

    line 42
  12. Distinctive:

    If the file exists with correct permissions: use the keys silently.

    line 43
  13. Distinctive:

    Keep the parsed search results and metadata available for follow-up requests in the same conversation.

    line 72
  14. Distinctive:

    Run curl commands for each configured provider.

    line 74
  15. Distinctive:

    After presenting, ask if the user wants to download any of them.

    line 153
  16. Distinctive:

    When the user selects an image to download:

    line 157
  17. Very specific:

    Validate the URL: must start with https:// and match an allowed domain

    line 159
  18. Very specific:

    Unsplash special case: use the links.download URL from search results instead of urls.raw to comply with Unsplash API TOS (this triggers …

    line 160
  19. Very specific:

    Determine destination: default ./images/ in current project directory.

    line 161
  20. Distinctive:

    Verify: check file size and confirm to user

    line 169
  21. Distinctive:

    Attribution reminder: after download, remind the user:

    line 175
  22. Distinctive:

    When the user is working on a UI component and mentions needing an image, proactively offer to search stock images

    line 185
  23. Distinctive:

    Always present author attribution — Unsplash and Pixabay TOS require it

    line 186
  24. Distinctive:

    If no results found, suggest alternative search terms

    line 188
  25. Distinctive:

    If only one provider is configured, skip the provider selection and use it directly

    line 189

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Security Rules

  • NEVER display API keys in your output
  • NEVER echo full curl commands that contain API keys
  • Pixabay limitation: Pixabay requires the API key as a URL query parameter, which is visible in process lists (ps aux). Be aware of this inherent API limitation. Never display the full Pixabay curl command in output.
  • Only download from allowed domains:
    • images.pexels.com
    • images.unsplash.com, plus.unsplash.com
    • pixabay.com, cdn.pixabay.com
  • All URLs MUST use HTTPS
  • After downloading, check file size — alert if > 10MB
  • For Unsplash downloads, use the links.download URL (not urls.raw) to comply with Unsplash API TOS (triggers download count)

Non-Activation

Do NOT activate this skill when:

  • Discussing image components (<img>, next/image, etc.)
  • AI image generation is requested (that is a different skill)
  • Referencing existing images already in the project

Setup Detection

Before searching, check if API keys are configured:

test -f ~/.config/stock-images/keys.json && stat -f "%Lp" ~/.config/stock-images/keys.json 2>/dev/null || stat -c "%a" ~/.config/stock-images/keys.json 2>/dev/null
  • If the file does not exist: guide the user interactively through setup:
    1. Ask which providers they want to use (Pexels, Unsplash, Pixabay — all free)
    2. Provide the relevant signup links:
    3. Once the user provides their keys, create the config file via Bash with chmod 600
    4. NEVER display the keys back after saving
  • If permissions are not 600: warn the user and offer to fix with chmod 600 ~/.config/stock-images/keys.json.
  • If the file exists with correct permissions: use the keys silently. Do NOT display the file contents, the keys, or commands containing key values.

Determine configured providers without printing secret values:

python3 - <<'PY'
import json
from pathlib import Path

config = Path.home() / ".config" / "stock-images" / "keys.json"
data = json.loads(config.read_text())
providers = [
    name for name in ("pexels", "unsplash", "pixabay")
    if data.get(name) and not str(data[name]).startswith("YOUR_")
]
print("\n".join(providers))
PY

Parse the JSON to determine which providers are configured (have non-empty, non-placeholder values). At least one provider is required.

Search Implementation

Extract from the user's request:

  • query: what to search for (required)
  • count: how many images (default: 5, max: 20)
  • orientation: landscape, portrait, or square — infer from context (e.g., "hero banner" → landscape, "profile photo" → portrait)
  • provider: specific provider or "all" (default: all configured)

Keep the parsed search results and metadata available for follow-up requests in the same conversation. If the user later says "download image #3", map that number back to the exact provider, image URL, download URL, author, author profile, and attribution data from the presented results.

Run curl commands for each configured provider. When multiple providers are configured, run them in parallel (separate Bash tool calls).

Pexels

curl -sS -G --max-time 15 --fail "https://api.pexels.com/v1/search" \
  --data-urlencode "query=SEARCH_QUERY" \
  -d "per_page=COUNT" \
  -d "orientation=ORIENTATION" \
  -H "Authorization: PEXELS_KEY"

Response fields:

  • photos[].src.original — full image URL
  • photos[].src.medium — thumbnail
  • photos[].photographer — author name
  • photos[].photographer_url — author profile
  • photos[].width, photos[].height — dimensions

Unsplash

curl -sS -G --max-time 15 --fail "https://api.unsplash.com/search/photos" \
  --data-urlencode "query=SEARCH_QUERY" \
  -d "per_page=COUNT" \
  -d "orientation=ORIENTATION" \
  -H "Authorization: Client-ID UNSPLASH_KEY"

Response fields:

  • results[].urls.raw — full image URL
  • results[].urls.small — thumbnail
  • results[].user.name — author name
  • results[].user.links.html — author profile
  • results[].links.download — download URL (use this for downloads, not urls.raw)
  • results[].width, results[].height — dimensions

Pixabay

curl -sS -G --max-time 15 --fail "https://pixabay.com/api/" \
  -d "key=PIXABAY_KEY" \
  --data-urlencode "q=SEARCH_QUERY" \
  -d "per_page=COUNT" \
  -d "orientation=ORIENTATION" \
  -d "image_type=photo"

Pixabay-specific: map "landscape" → "horizontal", "portrait" → "vertical". Minimum per_page is 3.

Response fields:

  • hits[].largeImageURL — full image URL
  • hits[].previewURL — thumbnail
  • hits[].user — author name
  • hits[].user_id — for building profile URL: https://pixabay.com/users/USER-USER_ID/
  • hits[].imageWidth, hits[].imageHeight — dimensions
  • hits[].tags — description

Error Handling

  • curl exits non-zero / timeout: skip that provider, continue with others, inform user
  • HTTP 401: API key invalid or revoked — inform user, suggest re-running setup
  • HTTP 429: rate limit — inform user, suggest waiting or trying another provider
  • Empty / malformed JSON: skip provider, continue with others
  • Malformed keys.json: inform user config is corrupted, offer to recreate

Presenting Results

Present results in the user's language. Format:

## Results for "query" (N images)

### Provider Name
1. "Image Title/Description" — by [Author Name](author_profile_url)
   URL: https://...
   Resolution: WxH

After presenting, ask if the user wants to download any of them.

Download Implementation

When the user selects an image to download:

  1. Validate the URL: must start with https:// and match an allowed domain
  2. Unsplash special case: use the links.download URL from search results instead of urls.raw to comply with Unsplash API TOS (this triggers their download counter)
  3. Determine destination: default ./images/ in current project directory. Ask for confirmation if the directory doesn't exist before creating it.
  4. Generate filename: <query-slug>-<provider>.<ext> (e.g., mountain-landscape-pexels.jpg). Default extension is .jpg unless the URL clearly indicates otherwise (.png, .webp).
  5. Download:
curl -sL --max-time 30 --fail -o "./images/FILENAME" "IMAGE_URL"
  1. Verify: check file size and confirm to user
ls -lh "./images/FILENAME"
  1. Attribution reminder: after download, remind the user:

    Attribution required: Photo by [Author](author_url) on [Provider]

Alert if file size > 10MB — the user may want a smaller resolution.

Attribution and license requirements vary by provider and project use. Always preserve and present author attribution metadata so the user can comply with the relevant provider terms.

Behavior Guidelines

  • Infer orientation from context: "hero", "banner", "header" → landscape; "avatar", "profile" → portrait; "thumbnail", "icon" → square
  • When the user is working on a UI component and mentions needing an image, proactively offer to search stock images
  • Always present author attribution — Unsplash and Pixabay TOS require it
  • Respond in the user's language
  • If no results found, suggest alternative search terms
  • If only one provider is configured, skip the provider selection and use it directly

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.