dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Run DSH (DeepSeek Harness) on macOS inside a kernel sandbox, with every DeepSeek upload removed and Brave, Tavily or SearXNG search instead
Run DSH (DeepSeek Harness) on a Mac without it reading your files or talking to DeepSeek.
DeepSeek Harness is the open-source agent harness DeepSeek put out in August 2026. The plugin design is genuinely good. The defaults are not something I want on a machine that has client work on it. Out of the box on macOS, version 0.2.0-rc.2:
~/.ssh, ~/.aws, your Documents, anything you can read.The details, with file and line references, are in docs/REVIEW.md.
dsh-airlock is a launcher, a web search plugin and a pinned install. It does not fork DSH. It installs the upstream release from npm and changes how it runs.
sandbox-exec). Inside the box:
~/.dsh-airlock). Your real home folder can't be read, except the workspace folder..env files and skills folders are read-only, so the agent can't rewrite its own configuration.npm ci --ignore-scripts from a committed lockfile, so you get exact versions with integrity hashes and no install scripts run.sandbox-exec deprecated but still ships it. If it ever goes away, dsh-airlock refuses to start rather than run unboxed.You need macOS, Node.js 22 or newer and npm. No admin rights.
git clone https://github.com/ThatSimpleTech/dsh-airlock.git
cd dsh-airlock
./install.sh
That puts the launcher in ~/.local/bin/dsh-airlock (make sure that's on your PATH) and everything else in ~/.local/share/dsh-airlock. PREFIX=/some/dir ./install.sh installs somewhere else.
Start in setup mode and add a model:
dsh-airlock --setup
Your browser opens the dsh web UI. Go to Settings > Models > Add model provider and pick Anthropic, OpenAI, another listed provider, or Custom model API for a gateway or a local server (Ollama, vLLM, LiteLLM). Then pick that model in the model picker so it's saved as the default, and press Ctrl+C. The official DeepSeek provider is gone. You can still run DeepSeek's open-weight models through any other host or your own server.
Set up web search. There are three options and each one is a key or a URL:
dsh-airlock --set-key BRAVE_SEARCH_API_KEY
dsh-airlock --search tavily
dsh-airlock --set-key TAVILY_API_KEY
json under search.formats in its settings.yml):
dsh-airlock --search searxng https://search.example.org
Or turn search off with dsh-airlock --search off. If the search service can't be reached, the agent gets an error that names the host and tells you how to switch.
Check the box holds:
dsh-airlock --selftest
From then on:
dsh-airlock
The agent works in ~/Documents/dsh-workspace. Put files there for it to work on. DSH_WORKSPACE=/some/folder dsh-airlock uses a different folder.
| Command | What it does |
|---|---|
dsh-airlock | Start the web UI. Settings and keys are read-only. |
dsh-airlock --setup | Start the web UI with settings writable, to add or change model keys. |
dsh-airlock --search brave | Use Brave Search (default). |
dsh-airlock --search tavily | Use Tavily. |
dsh-airlock --search searxng URL | Use a SearXNG server. |
dsh-airlock --search off | No web search. |
dsh-airlock --set-key NAME | Store a secret such as BRAVE_SEARCH_API_KEY. Prompts with input hidden. |
dsh-airlock --selftest | Run probe commands inside the box and report. |
dsh-airlock --check | Print the sandbox profile and the composed dsh configuration. |
dsh-airlock --run ARGS... | Run dsh ARGS... inside the box, for example --run headless "summarize this folder". |
Environment overrides: DSH_WORKSPACE, DSH_PORT (default 3080), DSH_AIRLOCK_HOME (default ~/.dsh-airlock), DSH_AIRLOCK_ROOT (default ~/.local/share/dsh-airlock), DSH_AIRLOCK_NODE, and DSH_AIRLOCK_NO_BROWSER=1 to print the sign-in URL instead of opening it.
| Path | What |
|---|---|
~/.local/bin/dsh-airlock | The launcher |
~/.local/share/dsh-airlock/upstream/<version> | The pinned DSH install, plus the search plugin |
~/.local/share/dsh-airlock/libexec | The command runner and self-test |
~/.dsh-airlock | The fake home: dsh settings, sessions, stored keys (.dsh/.env, .dsh/.credentials.yaml), airlock.conf |
~/Documents/dsh-workspace | The workspace |
./uninstall.sh removes the program files and leaves your data where it is.
Three layers of checks.
dsh-airlock --selftest runs about 40 probes inside the real box: reads of ~/.ssh, ~/.aws, Documents, Downloads, keychains, cloud storage and temp folders must fail; writes outside the workspace and to dsh's settings must fail; open, osascript, security, screencapture, the clipboard and other apps' preferences must fail; git, node and https must still work. Add your own paths, one per line, to ~/.dsh-airlock/selftest-probes. A credentials file you care about is a good one.test/prove.sh runs real agent turns with the network locked to your Mac, a fake model, fake Brave and Tavily APIs and a trap on every DeepSeek endpoint, while a hook inside dsh records every connection and DNS lookup it makes. It passes only if dsh talked to nothing but the local fakes, the trap saw nothing, the model requests carried no DeepSeek add-on fields, the agent's shell was confined, and search worked through the new plugin with both Brave and Tavily. It uses a throwaway home and workspace.cd plugins/web-search && npm test runs the search plugin's unit tests against local mock servers.DSH changes fast, and a new release can add new rows that phone home. Don't just bump the version.
upstream/package.json, then run npm install --package-lock-only --ignore-scripts in upstream/.dsh-base/cordis.patch.yml and dsh-web-app/cordis.patch.yml and grep the @deepseek-ai packages for hosts../install.sh, then test/prove.sh and dsh-airlock --selftest. Both have to pass.~/.dsh-airlock/.dsh/cordis.patch.yml, the home layer, which ranks above the per-profile layer the web UI saves to. That's where the DeepSeek rows get disabled and the search plugin gets mounted, so nothing saved in Settings can turn them back on.node under sandbox-exec with a clean environment. Children inherit the box. dsh's own per-command sandbox-exec would fail under it, since macOS refuses nested sandboxes, so dsh is pointed at libexec/passthrough-runner through its sandbox.runnerCommand setting.plugins/web-search registers a provider with dsh's web seam (ctx.web). dsh only imports plugins in the dependency closure of its own package.json, so the installer adds one dependency line to the installed copy of that file. That's the only edit made to an upstream file.Apache-2.0. See LICENSE.
DSH itself is MIT licensed and is installed from npm, not redistributed here. "DeepSeek Harness" is a trademark of DeepSeek. dsh-airlock is not affiliated with or endorsed by DeepSeek, and per their brand guidelines it uses the "DSH" name.