Searxng Search

YPares/agent-skills/searxng-search

by YPares69660b8be900d642a5d4da8cbb687ec6cfb14ea5No licenseListed Oct 9, 2026Updated Oct 9, 2026

Enhanced web and package repository search using local SearXNG instance

Includes scriptsResearch & Analysis
AI-generated overview

Runs a local SearXNG metasearch container and queries it over HTTP for web and package repository results.

What it does
This skill starts a local SearXNG metasearch instance using podman or docker and queries it through its JSON search API. It covers general web search plus package and code repository categories such as cargo, packages, repos, it and code, and documents the JSON response structure. It also provides workarounds for PyPI searching via the PyPI JSON API or the qypi CLI, and includes a Nushell helper example and debugging commands.
When to use it
Use it when an agent needs privacy-respecting web search or package and repository lookups from a locally hosted metasearch engine. It fits tasks such as finding crates, npm packages, GitHub repositories or general web results through a consistent JSON interface.
Requirements
Requires podman or docker to run the SearXNG container, curl for HTTP requests, and network access for the container to reach upstream search engines. The skill ships executable scripts (start-searxng and searx). Optional tooling mentioned includes jq, Nushell, and uvx with qypi for PyPI lookups.

SearXNG Search

SearXNG is a privacy-respecting metasearch engine that you can run locally. It aggregates results from multiple search engines and package repositories, returning clean JSON output.

Quick Start

Start SearXNG:

bash
start-searxng --detach

This will:

  • Auto-detect podman or docker
  • Create a minimal config with JSON output enabled
  • Start SearXNG on http://localhost:8888
  • Wait until ready

Stop SearXNG:

bash
podman stop searxng  # or: docker stop searxng

Custom port:

bash
start-searxng --port 9999 --detach

Quick Reference

TaskCommandCategory
General web searchcurl "http://localhost:8888/search?q=<query>&format=json"general
Search Cargo/crates.iocurl "http://localhost:8888/search?q=<crate>&format=json&categories=cargo"cargo
Search npm packagescurl "http://localhost:8888/search?q=<pkg>&format=json&categories=packages"packages
Search code repositoriescurl "http://localhost:8888/search?q=<query>&format=json&categories=repos"repos
Search IT resourcescurl "http://localhost:8888/search?q=<query>&format=json&categories=it"it
Limit resultsAdd &limit=N to URL-
Multiple categories&categories=cat1,cat2-

Available Categories

Run to see all categories:

bash
curl -s "http://localhost:8888/config" | jq '.categories'

Notable categories:

  • general: General web search (default)
  • cargo: Rust crates from crates.io
  • packages: Multi-repo (npm, rubygems, haskell/hoogle, hex, packagist, metacpan, pub.dev, pkg.go.dev, docker hub, alpine, etc.)
  • it: IT/tech resources (includes GitHub, Docker Hub, crates.io)
  • repos: Code repositories
  • code: Code search
  • scientific publications: Academic papers
  • news, videos, images, books, etc.

See package-engine-status.md [blocked] for comprehensive package search testing results.

JSON Response Structure

json
{  "query": "search term",  "number_of_results": 0,  "results": [    {      "url": "https://example.com",      "title": "Result Title",      "content": "Snippet of content...",      "publishedDate": "2025-01-01T00:00:00",      "engine": "duckduckgo",      "engines": ["duckduckgo", "startpage"],      "score": 3.0,      "category": "general"    }  ],  "answers": [],          // Direct answers/infoboxes  "suggestions": [],      // Search suggestions  "corrections": [],      // Query corrections  "infoboxes": [],       // Knowledge panels  "unresponsive_engines": []}

Common Usage Patterns

1. Package Repository Searches

Cargo/Rust crates:

bash
curl -s "http://localhost:8888/search?q=tokio&format=json&categories=cargo" | \  jq '.results[] | {title, url, content}'

npm packages:

bash
curl -s "http://localhost:8888/search?q=express&format=json&categories=packages" | \  jq '.results[] | select(.engines[] == "npm") | {title, url, content}'

PyPI packages (workaround - see below):

bash
# PyPI engine is enabled but not returning results in current SearXNG config# Use direct API or qypi CLI instead (see PyPI Workaround section)

2. Web Search with Filtering

IT/Tech search:

bash
curl -s "http://localhost:8888/search?q=rust+async&format=json&categories=it" | \  jq '.results[0:5] | .[] | {title, url, engines}'

GitHub repositories:

bash
curl -s "http://localhost:8888/search?q=machine+learning&format=json&categories=repos" | \  jq '.results[] | select(.engines[] == "github") | {title, url}'

3. Extracting Specific Information

Get top 3 results:

bash
curl -s "http://localhost:8888/search?q=rust+ownership&format=json" | \  jq '.results[0:3] | .[] | {title, url, content}'

Check which engines returned results:

bash
curl -s "http://localhost:8888/search?q=python&format=json" | \  jq '.results[0].engines'

Get answer boxes/infoboxes:

bash
curl -s "http://localhost:8888/search?q=rust+language&format=json" | \  jq '.infoboxes, .answers'

PyPI Workaround

Since PyPI is not returning results in SearXNG (despite being enabled), use these alternatives:

Option 1: Direct PyPI JSON API

bash
# Search (limited to simple package name matching)curl -s "https://pypi.org/pypi/<package>/json" | jq '.info | {name, summary, version, home_page}'
# Example:curl -s "https://pypi.org/pypi/requests/json" | jq '.info.summary'

Option 2: qypi CLI tool

bash
# Installuvx qypi search pandas --json
# Get package infouvx qypi info requests --json
# List releasesuvx qypi releases flask --json

See references/pypi-direct-search.md for more details.

Integration with Nushell

Create a helper function:

nu
def searx [  query: string,  --category (-c): string = "general",  --limit (-l): int = 10] {  http get $"http://localhost:8888/search?q=($query | url encode)&format=json&categories=($category)"  | get results  | first $limit  | select title url content engines}

Usage:

nu
searx "tokio async" --category cargo --limit 5searx "flask tutorial" --category general

Debugging

Check SearXNG config:

bash
curl -s "http://localhost:8888/config" | jq '.engines[] | select(.name == "pypi")'

Check for engine errors:

bash
curl -s "http://localhost:8888/search?q=test&format=json" | jq '.unresponsive_engines'

Test specific engine:

bash
curl -s "http://localhost:8888/search?q=flask&format=json&engines=pypi" | jq .

Known Issues

  • PyPI engine enabled but not working: Use direct API or qypi CLI as workaround
  • Cargo category sometimes returns empty: Try categories=packages or categories=it which also include crates.io
  • Rate limiting: SearXNG may rate-limit if too many requests in quick succession

Configuration

Using the Helper Script (Recommended)

The start-searxng script creates a minimal configuration automatically:

bash
start-searxng --help

Default config includes:

  • use_default_settings: true (inherits all SearXNG defaults)
  • JSON format enabled
  • Rate limiting disabled (for local use)
  • Secret key (change in production!)

Using Your Own Config

bash
start-searxng --config /path/to/your/config/dir

Your config directory should contain settings.yml.

Manual Container Start

bash
# Create configmkdir -p /tmp/searxng-configcat > /tmp/searxng-config/settings.yml << 'EOF'use_default_settings: truesearch:  formats:    - html    - jsonserver:  secret_key: "change-me-in-production"  bind_address: "0.0.0.0"  port: 8080EOF
# Start with podmanpodman run --rm -d --name searxng \  -p 8888:8080 \  -v /tmp/searxng-config:/etc/searxng:Z \  docker.io/searxng/searxng:latest
# Or with dockerdocker run --rm -d --name searxng \  -p 8888:8080 \  -v /tmp/searxng-config:/etc/searxng \  docker.io/searxng/searxng:latest

Check Logs

bash
podman logs searxng  # or: docker logs searxng

Advanced Config

See SearXNG Settings Documentation for all options.

Minimal config to add JSON output to defaults:

yaml
use_default_settings: truesearch:  formats:    - html    - json

Source and attribution

Source:YPares/agent-skillsinsearxng-searchat commit69660b8

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal