webctl
Go CLI: multi-provider web search for coding agents, Jev scores and dedupes hits, optional scrape chunk filter; skimmer splits the same filter for any file or URL.
Overview
webctl (github.com/dorkitude/webctl, Go) from Kyle (@dorkitude on X) is a smart web search CLI for agents. It queries up to three providers per run (Brave first when keyed; keyless Exa, Parallel, Keenable, You.com, Firecrawl, then DuckDuckGo when no search key exists), fuses lists by reciprocal rank, scores each result with Jev against the query and an explicit --goal, applies a default score cutoff, dedupes in two passes (normalized URL or title, then MinHash LSH candidate pairs Jev judges as same or different), and can optionally scrape top hits and filter ~2000 character chunks with overlap. Install via Homebrew, apt, npm, or go install. The separate skimmer repo (github.com/dorkitude/skimmer, created 2026-10-10) is the same chunk filter for URLs, files, directories, rg pipes, and JSON or line lists; this page covers both tools.
Problem: Coding agents without built-in web search burn context on noisy SERP snippets, duplicate URLs, and full pages when only a few paragraphs matter.
Built for: Claude Code, Codex, pi, or custom harness authors who want a shell-first search tool that ranks and dedupes hits with TypeSafe Jev before the model reads them.
First indexed on Jev Directory: 2026-09-20
Creator and team
- Name
- Kyle
- Handle
- @dorkitude
How Jev is used
- Role in the product flow
- Per-result relevance Score (0 to 10), optional Noul for custom gates, near-duplicate Noul pairs, and per-chunk relevance when scraping or via skimmer
- Primitives
- ScoreNoul
- State in
- Search title, URL, and snippet up to 600 characters per hit; optional full excerpt as content; scrape chunks with query and goal; skimmer passes chunk text or list fields with a required goal.
- Decision out
- Numeric relevance scores with default cut at 6; optional yes or no via --noul; duplicate pairs collapsed to the best-scored copy; scrape and skimmer keep only chunks above threshold while skimmer retains chunks Jev cannot judge.
- Query configured search providers with cooldown-aware fallback (~/webctl/cooldown.json on 429 or 402)
- Pass each result batch to Jev with query and --goal for scoring
- Dedupe pass one on normalized URL or title; pass two on MinHash LSH pairs sent to Jev in one batch
- Optional --scrape --filter-chunks on top results; or run skimmer skim or filter on local material
- Print ranked snippets for the agent harness
webctl is agent-facing web retrieval with Jev as the noise gate, not a chat answer layer. superagents-lab-jev-search plans Search1API queries inside a Cloudflare Worker and never ships as a Bash-only CLI. aurorainfra-grev filters lines you already have on stdin with sixteen Unix tools, not live SERP fusion. tamaratran-jev-pruner and tamaratran-fast-jev-compaction trim shell stdout or transcript tool rows with Noul keep or drop, not search ranking. dzhng-jevgrep walks a git tree for coding-agent excerpts. webctl plus skimmer cover search plus long-page and repo skim paths with the same Jev scoring philosophy. Jev calls bill to your TypeSafe key; benchmarks/README.md notes they are outside agent token counts. Cite github.com/dorkitude/webctl README, docs/providers.md, docs/filtering.md, benchmarks/README.md, and github.com/dorkitude/skimmer README only.
Sourced performance claims
- README schematics: about 25 raw results per provider scored down to about 10 to 15 relevant hits; scrape mode shows about 25 chunks filtered to about 3 to 6 relevant chunks per page.Source: github.com/dorkitude/webctl README schematics
- benchmarks/README.md (2026-09-20/21, experiments 01 to 04, 30 cases): Claude webctl without scrape averaged 1.5k payload tokens and quality 9.40 versus Claude native 1.0k tokens and 8.53; webctl with --scrape --filter-chunks top 3 averaged 4.6k payload and 9.47 quality.Source: github.com/dorkitude/webctl benchmarks/README.md
- skimmer README example: kept 4 of 40 chunks, 71k to 7.6k chars (89% saved) on a Bloom filter Wikipedia skim.Source: github.com/dorkitude/skimmer README
- Public GitHub repo dorkitude/webctl had 158 stars, created 2026-09-20; dorkitude/skimmer had 28 stars, created 2026-10-10.Source: GitHub API, 2026-10-12
Features and stack
Features
- Up to three providers per search with reciprocal rank fusion and shared cooldown ladder (15m to 72h strikes)
- Jev scores each hit 0 to 10 with default min 6; --noul and --rubric overrides
- Two-pass dedupe: URL or title collapse, then MinHash LSH plus Jev same-content judgment
- --scrape --filter-chunks for long pages (~2000 char chunks, overlap configurable in skimmer)
- skimmer skim for URLs, files, dirs, and rg -n pipes with path:start-end citations
- skimmer filter for JSON, JSONL, or line lists; keeps items Jev cannot judge
- Homebrew, apt, npm, go install for webctl; Homebrew, apt, Scoop, go install for skimmer
Stack
- Go
- TypeSafe Jev
- Brave, Exa, Parallel, and other providers per docs/providers.md
- skimmer (sibling repo) for non-search skim and filter
Pricing: Open source CLI; TypeSafe Jev usage bills to your key. Search backends may be free tier, keyed, or IP throttled per docs/providers.md.
Links
FAQ
- What is skimmer and how does it relate to webctl?
- skimmer (github.com/dorkitude/skimmer) is webctl's chunk filter extracted as its own CLI. Use skimmer skim on URLs, files, or rg output and skimmer filter on JSON or line lists. webctl --scrape --filter-chunks uses the same idea on search results.
- Does webctl need a Jev key?
- README says searching can run without a Jev key using keyless search endpoints, but Jev scoring and filtering need a TypeSafe key from webctl setup. Without a key you get thinner results and no relevance filter.
- How is webctl different from jev-search?
- jev-search is a TypeScript Cloudflare Worker that plans Search1API queries. webctl is a Go agent CLI that fuses live SERP providers, scores with Jev, dedupes, and optionally scrapes chunks.
- What does skimmer do when Jev cannot judge a chunk?
- skimmer README states that when Jev cannot judge a chunk (for example a failed batch), skimmer keeps it rather than silently dropping it.
- When should I use --scrape --filter-chunks?
- webctl README and benchmarks/README.md: snippets are usually enough; scrape pays on long PDFs, threads, and transcripts, not on short dev-doc facts. Summarize mode can shrink scrape payload further when configured.
Related learn guides
Original Jev guidance that pairs with this product pattern.
- System One model
The model family behind Jev: parallel typed questions, one forward pass, probabilities you can threshold.
- Jev use cases
The patterns builders actually search for: moderation, routing, triage, RAG verify, and agent gates.
- Jev vs LLM classification
When to gate with System One probabilities instead of asking a chat model to label things.
Related products
Hand-picked neighbors with rich profiles or overlapping tags.