
Web Research
Run parallel Pollinations search models from a shell script to answer research prompts without hand-copying between Gemini Search and Perplexity tabs.
Overview
Pollinations web-research is an agent skill most often used in Idea (also Validate, Grow) that runs parallel Pollinations search models from a bash CLI to answer research prompts.
Install
npx skills add https://github.com/pollinations/pollinations --skill web-researchWhat is this skill?
- Default parallel query across `gemini-search` and `perplexity-fast`
- `--model` for a single backend or `--models` CSV for a custom set
- Loads optional `.env` from the skill tree without overwriting existing env vars
- Documented CLI usage with quoted prompt argument
- Examples for single-model and custom model lists (`nomnom`, etc.)
- Default model pair: gemini-search and perplexity-fast queried in parallel
Adoption & trust: 1 installs on skills.sh; 4.6k GitHub stars; 1/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
What problem does it solve?
You need quick, multi-source web answers for product or market questions but do not want to manually run separate search APIs or tab-hop between tools.
Who is it for?
Indie builders scripting research during ideation, landing copy validation, or lightweight competitive checks from the terminal or agent shell.
Skip if: Deep archival research requiring curated citations, private corpus RAG, or workflows that cannot use network-backed Pollinations models.
When should I use this skill?
You have a research question in quotes and want Pollinations search models via `web-research.sh` with default or custom `--models`.
What do I get? / Deliverables
You get consolidated model output from one quoted prompt invocation, with configurable single- or multi-model runs loaded from your local `.env` when present.
- Terminal output from one or more search models for the given prompt
- Reproducible CLI invocation pattern for agents (--model / --models flags)
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Web research is shelved under Idea because builders most often invoke it while discovering markets, competitors, and product facts before committing to build. The `research` subphase fits a bash-driven query tool whose default is `gemini-search` and `perplexity-fast` in parallel.
Where it fits
Run the default dual-model query to learn what a niche API does before you sketch features.
Fact-check positioning bullets on a landing page draft against live web answers.
Refresh changelog or blog claims with a single `--model perplexity` pass for speed.
How it compares
A CLI research fan-out skill—not a journey-wide planning methodology or in-repo code review checker.
Common Questions / FAQ
Who is Pollinations web-research for?
Solo builders and agent users who want a repeatable shell script to query Pollinations search models instead of one-off HTTP experiments.
When should I use Pollinations web-research?
In Idea for market and competitor discovery, in Validate when checking claims for a landing page or scope doc, and in Grow when refreshing positioning or support FAQs from the open web.
Is Pollinations web-research safe to install?
Check the Security Audits panel on this page, keep API keys only in `.env`, and avoid piping sensitive customer data into third-party search models without reviewing your compliance needs.
SKILL.md
READMESKILL.md - Web Research
#!/bin/bash set -euo pipefail SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) ENV_FILE="$SCRIPT_DIR/../.env" load_dotenv() { local file="$1" [ -f "$file" ] || return 0 while IFS= read -r line || [ -n "$line" ]; do line="${line%$'\r'}" case "$line" in ""|\#*) continue ;; esac if [[ "$line" == export\ * ]]; then line="${line#export }" fi if [[ "$line" != *=* ]]; then continue fi local key="${line%%=*}" local value="${line#*=}" if [[ ! "$key" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]]; then continue fi if [[ "$value" == '"'*'"' ]]; then value="${value#\"}" value="${value%\"}" elif [[ "$value" == "'"*"'" ]]; then value="${value#\'}" value="${value%\'}" fi if [ -z "${!key:-}" ]; then export "$key=$value" fi done < "$file" } DEFAULT_MODELS="gemini-search,perplexity-fast" MODEL="" MODELS_CSV="$DEFAULT_MODELS" PARALLEL="true" usage() { cat >&2 <<'USAGE' Usage: web-research.sh [--model MODEL] [--models MODEL1,MODEL2,...] "your prompt" Default: queries gemini-search and perplexity-fast in parallel. Examples: web-research.sh "What is pollinations.ai?" web-research.sh --model perplexity "Use only one model" web-research.sh --models gemini-search,nomnom "Custom model set" USAGE } while [ "$#" -gt 0 ]; do case "$1" in --model) shift MODEL="${1:-}" if [ -z "$MODEL" ]; then usage exit 2 fi ;; --models) shift MODELS_CSV="${1:-}" if [ -z "$MODELS_CSV" ]; then usage exit 2 fi ;; -h|--help) usage exit 0 ;; --) shift break ;; -*) echo "Unknown option: $1" >&2 usage exit 2 ;; *) break ;; esac shift done PROMPT="$*" if [ -z "$PROMPT" ]; then usage exit 2 fi if [ -f "$ENV_FILE" ]; then echo "Using local .env: $ENV_FILE" >&2 else echo "No local .env found at: $ENV_FILE" >&2 fi load_dotenv "$ENV_FILE" API_KEY="${POLLINATIONS_API_KEY:-}" if [ -z "$API_KEY" ]; then printf "POLLINATIONS_API_KEY not set. Enter API key: " >&2 read -r -s API_KEY echo >&2 fi if [ -z "$API_KEY" ]; then echo "Missing API key." >&2 exit 2 fi export GEMINI_SEARCH_PROMPT="$PROMPT" make_body() { local model="$1" export GEMINI_SEARCH_MODEL="$model" python3 - <<'PY' import json import os import sys prompt = os.environ.get("GEMINI_SEARCH_PROMPT") model = os.environ.get("GEMINI_SEARCH_MODEL") if not prompt: sys.exit(2) if not model: sys.exit(2) print(json.dumps({ "model": model, "messages": [{"role": "user", "content": prompt}], })) PY } print_response() { python3 -c ' import json, sys try: d = json.load(sys.stdin) c = d.get("choices", []) if c: msg = c[0].get("message", {}).get("content", "") if msg: print(msg) else: print(json.dumps(d, indent=2)) else: print(json.dumps(d, indent=2)) except Exception as e: print(f"Error: {e}", file=sys.stderr) ' } run_one() { local model="$1" local body body=$(make_body "$model") curl -sS "https://gen.pollinations.ai/v1/chat/completions" \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d "$body" | print_response } if [ -n "$MODELS_CSV" ]; then IFS=',' read -r -a MODELS <<< "$MODELS_CSV" if [ "$PARALLEL" = "true" ]; then TMP_DIR=$(mktemp -d) trap 'rm -rf "$TMP_DIR"' EXIT i=0 for m in "${MODELS[@]