{"id":51118537,"url":"https://github.com/rishang/seek","last_synced_at":"2026-06-25T00:00:42.297Z","repository":{"id":366210963,"uuid":"1272165853","full_name":"Rishang/seek","owner":"Rishang","description":"Web search for your coding agents ","archived":false,"fork":false,"pushed_at":"2026-06-20T18:52:36.000Z","size":163,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-20T20:10:18.603Z","etag":null,"topics":["claude-code","exaa","firecrawl","golang","kilo-code","opencode","pi","tavily","web","web-search","webscraping"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Rishang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-17T10:53:54.000Z","updated_at":"2026-06-20T19:24:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Rishang/seek","commit_stats":null,"previous_names":["rishang/seek"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/Rishang/seek","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rishang%2Fseek","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rishang%2Fseek/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rishang%2Fseek/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rishang%2Fseek/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Rishang","download_url":"https://codeload.github.com/Rishang/seek/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rishang%2Fseek/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34753781,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","exaa","firecrawl","golang","kilo-code","opencode","pi","tavily","web","web-search","webscraping"],"created_at":"2026-06-25T00:00:39.772Z","updated_at":"2026-06-25T00:00:42.292Z","avatar_url":"https://github.com/Rishang.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.svg\" width=\"180\" alt=\"seek logo\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eseek\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eLive web access for CLI coding agents — 8 providers, one command, automatic failover.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Go-1.25-111111?style=flat-square\" alt=\"Go 1.25\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/rishang/seek?style=flat-square\u0026color=111111\u0026label=stars\" alt=\"Stars\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/v/release/rishang/seek?style=flat-square\u0026color=111111\u0026label=release\" alt=\"Release\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/license-MIT-111111?style=flat-square\" alt=\"MIT license\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#-quick-start\"\u003eQuick Start\u003c/a\u003e ·\n  \u003ca href=\"#-the-skill--how-the-agent-learns-to-use-seek\"\u003eThe SKILL\u003c/a\u003e ·\n  \u003ca href=\"#-install-in-one-shot--let-the-agent-do-it\"\u003eOne-Shot Install\u003c/a\u003e ·\n  \u003ca href=\"#-manual-setup--per-agent\"\u003ePer-Agent Setup\u003c/a\u003e ·\n  \u003ca href=\"#-providers\"\u003eProviders\u003c/a\u003e ·\n  \u003ca href=\"#-commands\"\u003eCommands\u003c/a\u003e ·\n  \u003ca href=\"#-faq\"\u003eFAQ\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003e **seek is a tool *for* coding agents, not for humans.**  \n\u003e You install it once. Claude Code, Cline, OpenCode, Antigravity CLI — your agent calls it on every web lookup. You never type `seek` again.\n\n---\n\n## The Problem\n\nYour coding agent needs the current version of a library. The docs that changed last week. A breaking API update that happened after its training cutoff. Without real web access, it hallucinates from stale data.\n\nSo you hand it a search provider key — and then it rate-limits. Or expires. Or the agent stalls mid-task, waiting on a 401 it doesn't know how to recover from.\n\n**seek fixes this.** It sits in front of 7 search/fetch/crawl providers and fails over silently. Your agent calls `seek search`. If Tavily is rate-limited, Exa answers. If Exa is down, Firecrawl answers. The agent sees a result, never an error.\n\n---\n\n## How Failover Works\n\n```\nseek search \"rust async runtimes 2026\"\n     │\n     ├─ tavily      → 401 (key expired)   → next\n     ├─ exa         → 429 (rate limited)  → next\n     └─ firecrawl   → 200 ✓               → result\n```\n\nThe agent never knows. It called `seek search`. It got an answer. It kept working.\n\n---\n\n## ⚡ Quick Start\n\n**Step 1 — Install seek** (one time, choose one)\n\n```sh\n# Install script — Linux / macOS\ncurl -fsSL https://raw.githubusercontent.com/Rishang/seek/main/install.sh | sh\n\n# install-release (ir)\nir get https://github.com/Rishang/seek\n\n# mise\nmise use -g github:Rishang/seek\n```\n\n**Step 2 — Add your provider keys**\n\n```sh\nseek config init   # interactive form — paste in your API keys\n```\n\nYou need at least one key from any of the [7 supported providers](#-providers). Free tiers work.\n\n**Step 3 — Wire it into your agent** _(easiest: just ask your agent to do it)_\n\n```sh\n# Claude Code — run in terminal (one-shot; needs shell access)\nclaude -p \"install seek from https://github.com/Rishang/seek and register its web-fetch skill\" \\\n  --permission-mode acceptEdits\n\n# OpenCode — run in terminal\nopencode run \"install seek and wire it as an MCP server — ref https://github.com/Rishang/seek\"\n\n# Antigravity CLI (agy) — run in terminal (one-shot; needs shell access)\nagy -p \"install seek from https://github.com/Rishang/seek and configure it as an MCP server\" \\\n  --dangerously-skip-permissions\n\n# Cline / Cursor / any MCP agent — paste in chat (no shell wrapper):\n# install seek from https://github.com/Rishang/seek and add it as an MCP server\n\n# Pi — native pi-package with auto-install\npi install git:github.com/Rishang/seek\n```\n\nThe agent reads this README, runs the install, and wires itself up. You just supply the API keys.\n\n→ Need to do it manually? See [per-agent setup](#-manual-setup--per-agent).\n\n---\n\n## 🧠 The SKILL — How the Agent Learns to Use seek\n\n[`skills/SKILL.md`](https://github.com/Rishang/seek/blob/main/skills/SKILL.md) is a plain Markdown file you drop into your agent's skills folder. The agent reads it once and learns everything — what commands to run, when to stop, how to stay cheap. No prompting, no wrapping, no custom code required.\n\nThe file has a metadata header that agents use to discover and load it:\n\n```\nname:        web-fetch\ndescription: Search the web and fetch full page content via seek\n             (firecrawl/tavily/brave/spider). Use for research,\n             fact-checking, documentation lookups, or any task\n             requiring current web information.\n```\n\n---\n\n### The Loop: search → decide → maybe fetch → stop\n\n```\nseek search -o csv \"\u003cquery\u003e\"\n# output: title,url,snippet,published_date  (one row per result)\n```\n\nThe snippet is substantial — often several sentences, not a teaser. **For many lookups the snippet already is the answer.**\n\n```\nStep 1 — Search\n  seek search -o csv \"\u003cquery\u003e\"  →  read snippets + URLs\n\nStep 2 — Decide\n  Snippets answer the objective?\n    YES → STOP. Answer from snippets. Don't fetch.\n    NO  → fetch the single most relevant URL.\n\nStep 3 — Fetch (only if needed)\n  seek fetch \"\u003curl\u003e\"  →  full page as markdown\n\nStep 4 — Stop the moment the objective is met.\n  First page missed → fetch the next best ONCE, then re-decide.\n  Never fetch a second URL \"to be thorough.\"\n```\n\n---\n\n### Shortcuts That Skip Search Entirely\n\nThe SKILL also teaches the agent smarter paths when search isn't needed:\n\n**Have the exact URL?**\n```sh\nseek fetch \"https://\u003chost\u003e/\u003cpath\u003e\"\n# Done. No search round-trip.\n```\n\n**Know the doc site domain but not the path?**\n```sh\n# Guess the conventional structure first (Mintlify/Docusaurus pattern)\nseek fetch \"https://docs.example.com/\u003ctopic\u003e/overview\"\n# Real content? Done — the page's own nav exposes every sibling URL.\n```\n\n**Know the domain but not the structure?**\n```sh\n# Fetch the index and grep — one piped command\nseek fetch \"https://\u003chost\u003e/llms.txt\" | rg \"\u003ckeyword\u003e\" | head -20\n# Hit  → fetch that URL\n# Miss → fall back to seek search\n```\n\n\u003e If `llms.txt` returns \"omitted\" / \"truncated\" / \"pages omitted\" — skip the grep, go straight to `seek search`.\n\n---\n\n### Hard Limits Built Into the SKILL\n\nThese guards are baked in so the agent never burns your token budget:\n\n| Rule | Why |\n|---|---|\n| Snippets before fetches | Every fetch is a full page of tokens |\n| One page at a time | Never batch-fetch; read before getting the next |\n| Pipe `llms.txt` through `rg`, never dump it raw | Indexes can be enormous |\n| No `seek crawl` unless explicitly asked | Crawl pulls many pages — for lookups, one search + one fetch is enough |\n| Empty fetch → one retry max, then fall back to `seek search` | Never loop fetches |\n| Not for APIs or local files | Use `curl` / `bash` / `read` instead |\n\n---\n\n### SKILL vs MCP — Which Should You Use?\n\n| | SKILL (Markdown file) | MCP Server (`seek mcp`) |\n|---|---|---|\n| How the agent gets it | Reads a `.md` file from its skills dir | Registered as a stdio MCP server |\n| Token efficiency | Agent follows the built-in loop + guards | Agent decides when/how to call tools |\n| Works with | Claude Code, Kilo Code, any skills-dir agent (incl. [Pi](https://github.com/earendil-works/pi) addon) | Cline, Cursor, OpenCode, Antigravity CLI, any MCP agent |\n| Setup | Drop one file | Add one JSON block |\n| Recommended for | Claude Code users | Everyone else |\n\nBoth use the same seek binary, same providers, same failover underneath.\n\n---\n\n## 🚀 Install in One Shot — Let the Agent Do It\n\nThis is the fastest path. **You don't need to manually copy files or edit configs.** Run one command in your terminal, or paste a prompt into your agent's chat. It reads this README, runs the install, drops the skill file, and reports back. You only need to supply your provider API keys afterwards (`seek config init`).\n\n### Claude Code\n\n```sh\nclaude -p \"install seek from https://github.com/Rishang/seek and register its web-fetch skill so you can search the web in future tasks\" \\\n  --permission-mode acceptEdits\n```\n\nOr start an interactive session with the same prompt: `claude \"install seek …\"`.\n\nClaude reads the README, runs the install script, and copies `SKILL.md` into `~/.claude/skills/web-fetch/` automatically.\n\n### OpenCode\n\n```sh\nopencode run \"install seek and wire it as an MCP server — ref https://github.com/Rishang/seek/blob/main/README.md\"\n```\n\n### Cline (VS Code)\n\nIn the Cline chat panel:\n\n```\ninstall seek from https://github.com/Rishang/seek and add it as an MCP server to my Cline config\n```\n\n### Cursor\n\nIn Cursor's composer:\n\n```\ninstall seek (https://github.com/Rishang/seek) and register it as an MCP server in my .cursor/mcp.json\n```\n\n### Antigravity CLI (agy)\n\n```sh\nagy -p \"install seek from https://github.com/Rishang/seek and configure it as an MCP server\" \\\n  --dangerously-skip-permissions\n```\n\nOr start an interactive session with the same prompt: `agy -i \"install seek …\"`.\n\n### Pi\n\nIf you use [Pi](https://github.com/earendil-works/pi) as your agent harness, register the skill (Pi's native integration — no MCP needed):\n\n```sh\npi -p \"install seek from https://github.com/Rishang/seek and register its web-fetch skill so you can search the web in future tasks\"\n```\n\nOr start an interactive session: `pi \"install seek …\"`.\n\n### Any other agent\n\nThe pattern is always the same — point the agent at this README and tell it what to do (in chat, no shell wrapper):\n\n```\ninstall seek from https://github.com/Rishang/seek and wire it up so you can search the web\n```\n\nAny agent that can read a URL and run shell commands can set itself up.\n\n---\n\n## 🔌 Manual Setup — Per Agent\n\nPrefer to wire it up yourself? Here are the exact steps per agent.\n\n### Claude Code — Skill (recommended)\n\nThe Skill is the native integration for Claude Code. Drop it in once; Claude reads it on every session.\n\n```sh\n# Global (all projects)\nmkdir -p ~/.claude/skills/web-fetch\ncurl -fsSL https://raw.githubusercontent.com/Rishang/seek/main/skills/SKILL.md \\\n  -o ~/.claude/skills/web-fetch/SKILL.md\n\n# Project-only\nmkdir -p .claude/skills/web-fetch\ncurl -fsSL https://raw.githubusercontent.com/Rishang/seek/main/skills/SKILL.md \\\n  -o .claude/skills/web-fetch/SKILL.md\n```\n\nThat's it. No config file, no restart. Claude picks up the skill on the next session.\n\n### Pi — Native pi-package (recommended)\n\nseek ships as a native [pi package](https://pi.dev/packages). One install — extension + skill, everything wired automatically.\n\n```sh\npi install git:github.com/Rishang/seek\n```\n\n**What you get:**\n- **Auto-install extension** — on session start, checks if `seek` is on PATH. If not, prompts for one-click install (downloads the right binary for your OS/arch from GitHub releases). Non-interactive mode shows the manual install command.\n- **`/seek-install` command** — manual (re)install anytime.\n- **`web-fetch` skill** — registered automatically via `resources_discover`. Invoke with `/skill:web-fetch` or let Pi load it when relevant.\n\n**Manual fallback** — drop the skill file directly:\n\n```sh\n# Global (all projects)\nmkdir -p ~/.pi/agent/skills/web-fetch\ncurl -fsSL https://raw.githubusercontent.com/Rishang/seek/main/skills/SKILL.md \\\n  -o ~/.pi/agent/skills/web-fetch/SKILL.md\n\n# Project-only\nmkdir -p .pi/skills/web-fetch\ncurl -fsSL https://raw.githubusercontent.com/Rishang/seek/main/skills/SKILL.md \\\n  -o .pi/skills/web-fetch/SKILL.md\n```\n\n### OpenCode — MCP Server\n\nAdd to `~/.config/opencode/config.json` (or your project's `opencode.json`):\n\n```json\n{\n  \"mcp\": {\n    \"seek\": {\n      \"command\": \"seek\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n```\n\n### Cline (VS Code) — MCP Server\n\nOpen the Cline MCP settings (gear icon → MCP Servers) and add:\n\n```json\n{\n  \"seek\": {\n    \"command\": \"seek\",\n    \"args\": [\"mcp\"],\n    \"disabled\": false\n  }\n}\n```\n\nOr edit `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json` directly.\n\n### Cursor — MCP Server\n\nCreate or edit `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"seek\": {\n      \"command\": \"seek\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n```\n\nRestart Cursor. seek will appear in the available tools list.\n\n### Antigravity CLI (agy) — MCP Server\n\nAdd to `~/.gemini/antigravity-cli/mcp_config.json` (or `.agents/mcp_config.json` in your project):\n\n```json\n{\n  \"mcpServers\": {\n    \"seek\": {\n      \"command\": \"seek\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n```\n\nUse `/mcp` inside `agy` to verify the server is connected.\n\n### Kilo Code / Aider / Any MCP-native agent\n\nThe MCP config block is the same for every agent that speaks MCP (JSON-RPC 2.0 over stdio):\n\n```json\n{\n  \"mcpServers\": {\n    \"seek\": {\n      \"command\": \"seek\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n```\n\n`seek mcp` exposes three tools — `search`, `fetch`, `crawl` — with the same provider failover as the CLI. The agent sees tools, not providers.\n\n### HTTP API — Any custom tool or pipeline\n\n```sh\nseek serve --addr 127.0.0.1:8787 --token \"$SEEK_SERVE_TOKEN\"\n```\n\n```sh\ncurl -s localhost:8787/search \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -d '{\"query\": \"latest golang release notes\"}'\n\ncurl -s localhost:8787/fetch \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -d '{\"url\": \"https://go.dev/doc/devel/release\", \"format\": \"markdown\"}'\n```\n\nSwagger UI at `GET /docs` · OpenAPI spec at `GET /openapi.json` · Liveness at `GET /healthz`\n\n\u003e ⚠️ Without `--token`, the API is unauthenticated — anyone who can reach the port can spend your provider keys. Always set a token, or bind to loopback only.\n\n---\n\n## Why seek instead of a provider SDK?\n\n| | Hardcode one SDK | seek |\n|---|---|---|\n| Provider goes down | Task fails | Silent failover to next provider |\n| Rate limit hit | Task fails | Silent failover to next provider |\n| Key expires | Task fails | Silent failover to next provider |\n| Add a new provider | Code changes | Add one key to config |\n| Agent integration | Custom glue code per agent | One skill file or `seek mcp` |\n| Token efficiency | Raw HTML response | CSV snippets by default |\n| Output format | Provider-specific | Normalized across all providers |\n\n---\n\n## 🌐 Providers\n\n8 providers, one interface. Configure one or all — `auto` uses whatever has a key.\n\n| Provider | search | fetch | crawl | Key env var |\n|---|---|---|---|---|\n| firecrawl | ✓ | ✓ | ✓ | `FIRECRAWL_API_KEY` |\n| tavily | ✓ | ✓ | ✓ | `TAVILY_API_KEY` |\n| spider.cloud | ✓ | ✓ | ✓ | `SPIDER_API_KEY` |\n| exa | ✓ | ✓ | — | `EXA_API_KEY` |\n| perplexity | ✓ | — | — | `PERPLEXITY_API_KEY` |\n| brave | ✓ | — | — | `BRAVE_API_KEY` |\n| webcrawlerapi | — | ✓ | ✓ | `WEBCRAWLERAPI_API_KEY` |\n| lightpanda | — | ✓ | — | `LIGHTPANDA_API_KEY` |\n\n`firecrawl` and `lightpanda` are **self-hostable** — set a custom host via `seek config init --host name=url` to point at your own instance. An env var always overrides a stored key.\n\n**Auto priority order:** `tavily → exa → firecrawl → spider.cloud → webcrawlerapi → lightpanda → brave → perplexity`. Reorder in `config.yaml` to change preference; index 0 wins. `perplexity` is last by default since its search quality is more variable for general queries.\n\n---\n\n## 📋 Commands\n\n| Command | What it does |\n|---|---|\n| `seek search \u003cquery\u003e` | Web search with auto-failover across providers |\n| `seek fetch \u003curl\u003e` | Fetch a page as markdown, html, or json |\n| `seek crawl \u003curl\u003e` | Crawl a site and return its pages |\n| `seek mcp` | Start MCP server over stdio (JSON-RPC 2.0) |\n| `seek serve` | Start HTTP API with Swagger at `/docs` |\n| `seek config init` | Configure providers and API keys (interactive or `--yes` for scripting) |\n| `seek config view` | Show current config and which keys are set |\n| `seek version` | Print the seek version |\n\n### Key Flags\n\n**Global:** `-v, --verbose` — prints debug logs including each failover, HTTP request, and MCP message to stderr.\n\n| Command | Flags |\n|---|---|\n| `search` | `-p/--provider`, `--start DD/MM/YYYY`, `--end DD/MM/YYYY`, `--range N`, `-o json\\|csv`, `--no-cache` |\n| `fetch` | `-p/--provider`, `-f/--format markdown\\|html\\|json`, `--no-cache` |\n| `crawl` | `-p/--provider`, `-o json\\|csv`, `--no-cache` |\n| `serve` | `--addr host:port` (default `127.0.0.1:8787`), `--token` |\n| `config init` | `--search`, `--fetch`, `--crawl`, `--format`, `--ttl \u003cdays\u003e`, `--key name=value`, `--host name=url`, `-y/--yes` |\n\n---\n\n## ⚙️ Configuration\n\nSettings live in `~/.seek/config.yaml`. API keys live in `~/.seek/provider.yaml` (written `0600` — never committed, never logged).\n\n```yaml\n# ~/.seek/config.yaml\nconfig:\n  search:\n    provider: auto\n  fetch:\n    provider: auto\n    cache:\n      enabled: true\n      ttl: 1296000      # 15 days in seconds\n      store: sqlite\n    options:\n      output_format: markdown\n  crawl:\n    provider: firecrawl\n\nproviders:\n  priority:             # index 0 = highest priority\n    - tavily\n    - exa\n    - firecrawl\n    - spider.cloud\n    - webcrawlerapi\n    - lightpanda\n    - brave\n```\n\nNon-interactive setup (great for CI or dotfiles):\n\n```sh\nseek config init --key firecrawl=fc-xxx --key tavily=tvly-xxx --yes\n```\n\n### Caching\n\n`fetch` and `crawl` results cache locally in SQLite. `search` always hits live. Bypass per-request with `--no-cache`.\n\n### Environment Variables\n\n| Variable | Effect |\n|---|---|\n| `\u003cPROVIDER\u003e_API_KEY` | Override stored key for that provider |\n| `SEEK_CONFIG` | Path to `config.yaml` (default `~/.seek/config.yaml`) |\n| `SEEK_PROVIDERS` | Path to `provider.yaml` (default `~/.seek/provider.yaml`) |\n| `SEEK_CACHE=off` | Disable all caching globally |\n| `SEEK_CACHE_DB` | Relocate the SQLite cache file |\n| `SEEK_CACHE_TTL` | Global TTL override (Go duration, e.g. `72h`) |\n\n---\n\n## 📦 Install Options\n\nAll methods drop a `seek` binary on your `PATH`.\n\n```sh\n# Pi native package (extension + skill, auto-install)\npi install git:github.com/Rishang/seek\n\n# Install script — Linux / macOS\ncurl -fsSL https://raw.githubusercontent.com/Rishang/seek/main/install.sh | sh\n\n# Pin a version or install dir\ncurl -fsSL .../install.sh | SEEK_VERSION=v0.1.0 SEEK_BIN_DIR=~/.local/bin sh\n\n# mise\nmise use -g github:Rishang/seek          # latest\nmise use -g github:Rishang/seek@0.1.0    # pinned\n\n# install-release (ir)\nir get https://github.com/Rishang/seek\n\n# ubi\nubi --project Rishang/seek --in ~/.local/bin\n\n# From source (Go 1.25+)\ngit clone https://github.com/rishang/seek \u0026\u0026 cd seek\ntask build   # or: cd src \u0026\u0026 go build -o ../bin/seek .\n```\n\n**Supported targets:** Linux and macOS (`amd64` / `arm64`), Windows `.zip` → [Releases](https://github.com/Rishang/seek/releases)\n\n---\n\n## 🛠 Development\n\n```sh\ntask build      # build bin/seek\ntask test       # go test ./...\ntask vet        # go vet ./...\ntask lint       # golangci-lint\ntask run -- search \"query\"\n```\n\nAll Go source lives in `src/`. Run `task` with no arguments to list every available task.\n\nContributions are welcome — open an issue to discuss before a large PR.\n\n---\n\n## ❓ FAQ\n\n**Which provider does `auto` pick?**  \nThe first one in `providers.priority` that supports the operation (search/fetch/crawl) and has a key configured. Reorder the list in `config.yaml` to change preference.\n\n**What if a provider isn't in my priority list?**  \nIt's still tried — appended after the listed ones. A typo in the list never silently drops a usable provider.\n\n**Do I need all 8 providers?**  \nNo. One key is enough. `auto` works with whatever it finds. More keys = more resilience.\n\n**Where do my API keys go?**  \n`~/.seek/provider.yaml` with `0600` permissions. Never in `config.yaml`. Set env vars to override stored keys at runtime.\n\n**Can I self-host the search backend?**  \nYes — `firecrawl` and `lightpanda` are self-hostable. Set a custom host via `seek config init --host firecrawl=http://your-host`.\n\n**Is seek useful without an agent?**  \nIt works fine from the CLI, but the design is optimized for agents — CSV output, token-efficient snippets, skill files, MCP server. For human use, the provider UIs are probably friendlier.\n\n---\n\n## License\n\nMIT — [Rishang](https://github.com/Rishang)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frishang%2Fseek","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frishang%2Fseek","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frishang%2Fseek/lists"}