Adds a button beside the composer and a global hotkey palette (default mod+shift+k) that hand one-off questions to a web chat instead of into the harness context: the draft is lifted out of the composer, copied to the clipboard and opened in the templated URL. Ships target-site presets (DeepSeek, Kimi, Qwen, 豆包, 腾讯元宝, GLM, Gemini), a local question history that can be re-opened, copied, or inserted back into the composer, and a settings tab for site, URL template, hotkey, clipboard and history.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-webask
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:DanZai233/dsh-webask
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Send one-liner questions to DeepSeek's web chat instead of burning your DSH context. Composer button · global hotkey palette · history.
DeepSeek Harness resends the whole conversation on every turn. So a twenty-token question — the kind you already know will be short — does not cost twenty tokens. It costs the entire context window it rides on.
WebAsk hands exactly those questions to the free web chat and never lets them enter the conversation at all.
What you get
A button beside the composer
You have already typed the question into DSH. Instead of sending it, click the WebAsk button. The text is lifted out of the draft — cleared through the official input actions, so it never reaches the model — copied to your clipboard, and opened in a new tab.
The button is disabled unless there is a real draft to lift and the composer is in a plain, sendable phase, so it can never fire mid-submission.
A palette on a global hotkey
mod+shift+k anywhere opens a centred input. Type, press Enter, done.
Shift+Enter for a newline, Esc to close.
Underneath sits a local history. Every question can be:
- re-opened in the web chat,
- copied again,
- or inserted back into the composer — the closing loop, for when the answer turns out to deserve follow-up in a real session.
A settings tab
Settings → Plugins → WebAsk: target site, URL template, global hotkey, whether to copy to the clipboard, history on/off, and the history limit.
An honest note about ?q=
https://chat.deepseek.com/?q=… is a community convention, not a feature of
the site. chat.deepseek.com does not read that parameter by itself — userscripts
exist specifically to add the behaviour. Pretending otherwise would make this
plugin quietly broken for everyone who does not have one installed.
So WebAsk does both things at once, every time:
- it always copies the question to your clipboard, and
- it opens the templated URL.
If you do run such a userscript, the flow is fully automatic. If you do not, you press ⌘V once in the tab that just opened. Either way the question costs zero tokens — which is the entire point.
Install
dsh plugin --profile web add dsh-webask
Then restart that profile. Plugin installs change the package graph, and the package manifest and client-module metadata are cached for the life of the process — a restart is what picks them up.
Verify before you restart, if you like:
dsh --profile web --dump-config | grep -A2 webask
Supported sites
Every preset below speaks the same ?q= convention:
| Site | Template |
|---|---|
| DeepSeek | https://chat.deepseek.com/?q={q} |
| Kimi | https://www.kimi.com/?q={q} |
| Qwen | https://chat.qwen.ai/?q={q} |
| 豆包 | https://www.doubao.com/?q={q} |
| 腾讯元宝 | https://yuanbao.tencent.com/?q={q} |
| 智谱 GLM | https://chatglm.cn/?q={q} |
| Gemini | https://gemini.google.com/?q={q} |
Because the template is editable, a site WebAsk has never heard of works too.
Use {q} where the question goes. With no {q} at all, the question is appended
as a q= query parameter, preserving whatever else the URL already carries.
Privacy
Nothing leaves your machine except the question you chose to ask a web chat, in
the tab you opened. History and settings live in this browser's localStorage
and are never uploaded. WebAsk sends nothing to the model, and its host half is
an empty mount row — no service, no tool, no route.
How it works
WebAsk is a presentation-only client plugin. It occupies three documented slots and reaches the composer only through published action faces — it never touches the DOM to read or clear your draft.
| Slot | Surface | Access used |
|---|---|---|
conversation.input.right |
the composer button | useInput (read draft, phase) + inputActions.setDraft (lift the draft out) |
shell.overlay |
palette + toasts | useSessions(s => s.current) for the active session, plus a bridge published by the composer button for insert-back |
settings.plugins.tab |
config page | useResource / useWorkspaces standard kit |
Notes for anyone reading the source:
- No build chain.
build.mjsis ~40 lines with zero dependencies: it inlines the stylesheet as a string and wrapssrc/client.jsin the CJS closure-factory the browser module loader expects. No bundler, no TypeScript, no CSS pipeline. require("react")is resolvable inside the client factory, so the UI is written withReact.createElementand needs no JSX transform.- Strings are registered with
ctx.localewith a built-in bilingual fallback, so the UI still reads correctly if the locale service is unavailable. - The overlay is root-scoped while the draft is per-session. Rather than reaching into the input hub by id, the composer button publishes its own official action face into a tiny shared store; "is there somewhere to insert into?" then has a truthful answer, and the insert-back action is disabled when there is not.
Development
npm run build # src/ -> lib/client.js
npm run verify # 37 offline checks: slot wiring, click paths, persistence
verify runs the built bundle in a VM against a fake browser and a minimal React
stub, then drives the real click paths. It catches a mistyped slot name or a
mis-read prop here, rather than as a button that silently does nothing.
License
MIT © DanZai233
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 8567
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8567
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 4363
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
ccch1mneyyy/dsh-TUI★ 4235
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/DSH-better-sidebar★ 4081
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1441
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.