Bundle
dsh-freeweb
Keyless web-search provider for DeepSeek Harness (dsh): DuckDuckGo + Startpage scrapers and Perplexity's anonymous ask endpoint behind a consensus fan-out. No API keys, no signup, no quota owner.
- Source
- Wiselfx
- stars
- 2 stars
- License
- MIT
- Updated
- Updated 11 hours ago
Readme
# dsh-freeweb
Keyless web search for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness).
No API keys. No signup. No quota owner.
## What it is
A [`WebSearchProvider`](docs/dsh.md) plugin for dsh's web capability seam
(`ctx.web`). It keeps dsh's built-in `web_search` tool, citation cards, and UI
exactly as they are, and swaps only the engine behind them. Queries fan out to
three independent keyless engines — plus an optional fourth — and come back as
one consensus-ranked answer.
| Engine | Kind | Needs |
| --- | --- | --- |
| **DuckDuckGo** (`html.duckduckgo.com`) | HTML scraper; POST with automatic GET fallback | nothing |
| **Startpage** (`startpage.com/sp/search`) | Google's index behind a privacy proxy; solves its Anubis SHA-256 proof-of-work in pure Node | nothing |
| **Perplexity** (`perplexity.ai/rest/sse/perplexity_ask`, anonymous) | synthesized answer + cited sources over SSE | nothing |
| **Firecrawl** (`api.firecrawl.dev/v2/search`, optional) | SERP-backed results, native Google operators | API key (env `FIRECRAWL_API_KEY`) or self-hosted endpoint; **auto-skipped without one** |
## Install
Requires [Node.js](https://nodejs.org) ≥ 20.3 and dsh. Nothing else.
**Straight from GitHub — no npm account needed:**
```sh
npx -y @deepseek-ai/dsh plugin --profile web add wiselfx/dsh-freeweb
```
`dsh plugin` forwards install specs to pnpm verbatim, so `owner/repo`, full
`https://github.com/….git` URLs, and pinned refs (`owner/repo#v0.1.0`) all
work — the package is fetched from GitHub and activated because it declares a
dsh bundle.
**Local checkout:**
```sh
npx -y @deepseek-ai/dsh plugin --profile web add /path/to/dsh-freeweb
```
**npm (if ever published):**
```sh
npx -y @deepseek-ai/dsh plugin --profile web add dsh-freeweb
```
Restart dsh, then verify composition without spending anything:
```sh
npx -y @deepseek-ai/dsh --profile web --dump-config # expect searchProvider: freeweb
```
See [docs/install.md](docs/install.md) for all three paths in detail,
uninstall steps, and troubleshooting.
## Configuration
Defaults live on the plugin entry; every value is optional:
```yaml
- id: freeweb
name: 'dsh-freeweb'
config:
engines:
duckduckgo: true
startpage: true
perplexity: true
firecrawl: auto # auto = only when a key/endpoint exists; true|false also accepted
firecrawlApiKey: '' # or env FIRECRAWL_API_KEY; free tier at firecrawl.dev, no card
softDeadlineMs: 6000 # early-return once ≥1 engine answered
hardDeadlineMs: 27000 # absolute cap; stragglers aborted
engineTimeoutMs: 25000 # per-engine transport timeout
```
The deadlines bound each call: engines get 25 s individually, the whole
fan-out returns early at 6 s once something has answered, and nothing outlives
27 s. Config changes take effect after a dsh restart.
## How it works
The provider fires every enabled engine concurrently and merges whatever comes
back by cross-engine agreement: URLs are deduplicated on a canonical key, then
ranked by how many engines returned them, then by best per-engine position. One
blocked or slow engine never fails a search — single-engine walls are absorbed
silently — and only every engine failing at once is an error. The full design,
including failure semantics and how to add an engine, is in
[docs/architecture.md](docs/architecture.md).
## Testing
```sh
node test/integration.mjs
```
Live end-to-end suite: exercises the real engines over the network and checks
the plugin wiring with a mock harness context. It passes. An optional argument
runs your own query:
```sh
node test/integration.mjs "your query here"
```
---
# ⚠️ This plugin was made by an AI
> **This plugin was designed, ported, and tested end-to-end by an artificial
> intelligence — Lantern (`ox-alpha`), an AI coding agent — with light human
> supervision. No human wrote the search logic.**
>
> The engines, the consensus merge, the deadline controller, and this
> documentation were all produced by the model working against a live network.
> Judge the code accordingly: it is unusually well tested and entirely without
> ego.
**Status: personal artifact / proof of concept.** This exists because its author
wanted keyless search inside dsh, and now it does that. It may or may not
receive updates. It is provided as-is. If you want a maintained version, fork
it — forks are welcome, and PRs are read when life allows.
## Credits & thank-yous
- [oh-my-pi](https://github.com/can1357/oh-my-pi) (MIT) — substantial portions
of this package are ported from its web-search subsystem, file mapping in
[NOTICE](NOTICE). It helped a LOT.
- [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) — an
excellent, plugin-friendly harness; genuinely pleasant to extend. One polite
nudge while we're here: built-in keyless web search would make it even
better.
- **Lantern** (`ox-alpha`), the AI that wrote this — a trace of its author
lives in every regex.
- **Cinder** (`hy3`), another AI — independent QA in a fresh container. Caught
the one manifest line this package shipped without, proved the GitHub
install path end-to-end, and took the first three cities (NYC · Boise ·
Seattle) through the fan-out. The lantern builds; the ember verifies.
- **wiselfx** — flipped every switch, pushed every fix, kept the vibe intact.
This artifact exists because they wanted it to.
## License
[MIT](LICENSE). Substantial portions are ported from oh-my-pi's MIT-licensed
web-search subsystem; see [NOTICE](NOTICE) for the copyright lines and the
file-by-file mapping.
Install
dsh plugin --profile web add github:Wiselfx/dsh-freeweb#faac95a4238c9774523c61c4582796779627aa6f
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-freeweb from the hub