Floating widget showing real-time OpenCode Go subscription usage (rolling/weekly/monthly) for every API key, with rate-limit alerts and automatic key-pool discovery.
Install
# from npm (prebuilt)
dsh plugin --profile web add @xiaweiliang060035/dsh-opencode-go-usage
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:xiaweiliang060035/dsh-opencode-go-usage
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. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
简体中文 · English
A DeepSeek Harness web-GUI plugin that shows your OpenCode Go subscription usage in real time — a floating widget that tracks rolling / weekly / monthly quota for every API key in your pool, with color-coded progress bars and reset countdowns.
Features
- Floating widget — a compact button pinned to the right edge of the page. Its badge shows the worst window across all keys at a glance; the color (green / orange / pulsing red) tells you whether any key is close to its quota limit.
- Expandable panel — click the button to open a panel with one card per key (the currently active key is marked with a ★), each showing rolling / weekly / monthly usage as progress bars, percentages, and time-until-reset. Rate-limited windows are flagged with ⚠.
- Real-time — the Host polls the official usage endpoint every 60 seconds (configurable); the panel refreshes automatically and has a manual refresh button.
- Auto key-pool discovery — reads your key pool from
$DSH_HOME/.credentials.yaml(anyOPENCODE_GO_KEY_<name>entries), so there is no hardcoded key count or name. Falls back to the single current key (OPENCODE_GO_API_KEY) when no pool exists. - i18n — Chinese / English, auto-selected from your browser language.
- Theme-aware — uses DSH theme tokens; works in both light and dark themes.
Screenshot

How it works
Host half (plain Node ESM):
- Discovers key-pool names — from
config.keyNamesif provided, otherwise by scanning.credentials.yamlforOPENCODE_GO_KEY_*entries. - Resolves each key value through the
credentialsservice (environment → credentials file →.envlayering). - Calls the official usage endpoint with
Authorization: Bearer <key>:
GET https://opencode.ai/zen/go/v1/usage
Authorization: Bearer <API_KEY>
Response example:
{
"usage": {
"rolling": { "status": "ok", "percent": 9, "resetsAt": "2026-08-14T07:20:04.810Z" },
"weekly": { "status": "ok", "percent": 12, "resetsAt": "2026-08-17T00:00:00.810Z" },
"monthly": { "status": "ok", "percent": 6, "resetsAt": "2026-09-09T00:41:03.810Z" }
}
}
The usage endpoint is not yet part of OpenCode's public documentation; it was discovered and verified via farion1231/cc-switch#6433. Parsing is defensive.
Client half (browser bundle) registers in the shell.overlay slot and polls the Host's web-server route /plugins/dsh-opencode-go-usage/snapshot. Keys never leave the Host.
Requirements
- Node.js + a DeepSeek Harness web profile (the default
dsh webprofile mountswebServer,credentials, andtimer, which this plugin needs).
Install
Option A — local package via file: dependency (recommended)
- Copy the package directory anywhere on disk, e.g.
D:\tools\dsh-opencode-go-usage. - In your profile's
package.json(e.g.$DSH_HOME/profiles/web/package.json), add todependencies:
"@xiaweiliang060035/dsh-opencode-go-usage": "file:D:/tools/dsh-opencode-go-usage"
- Add the package to the profile's bundle list (
dsh.profile.bundles):
"dsh": {
"profile": {
"bundles": [ "...existing...", "dsh-opencode-go-usage" ]
}
}
- Install and restart:
cd $DSH_HOME/profiles/web
pnpm install
# restart dsh web
The bundle carries its own cordis.patch.yml (declared via dsh.bundle.patch), so the plugin row is composed automatically — no manual patch edit needed.
Option B — npm package
The package is published on npm as @xiaweiliang060035/dsh-opencode-go-usage:
cd $DSH_HOME/profiles/web
pnpm add @xiaweiliang060035/dsh-opencode-go-usage
Then add "@xiaweiliang060035/dsh-opencode-go-usage" to the profile's dsh.profile.bundles list and restart dsh web.
The plugin registers both a Host half (fetch + webServer route) and a Client half (browser bundle). A plain copy into
plugins/with a relative patch entry loads the Host half only — the floating widget needs the bundle mechanism above.
Configuration
Tunables go in the plugin row's config (override it in your profile's cordis.patch.yml):
- id: opencode-go-usage
config:
keyNames: [go1, go2] # optional: explicit key-pool names
baseUrl: https://opencode.ai/zen/go/v1/usage # optional
refreshMs: 60000 # optional: poll interval (ms)
timeoutMs: 15000 # optional: fetch timeout (ms)
dshHome: ~ # optional: override the DSH home directory
hideCordisPanel: true # optional: hide the built-in "Cordis plugins" sidebar entry
| Key | Default | Description |
|---|---|---|
keyNames |
auto-discovered | Explicit key-pool names (OPENCODE_GO_KEY_<name> in .credentials.yaml) |
baseUrl |
https://opencode.ai/zen/go/v1/usage |
The usage endpoint |
refreshMs |
60000 |
Host poll interval in milliseconds |
timeoutMs |
15000 |
Fetch timeout in milliseconds |
dshHome |
resolveDshHome() |
DSH home directory containing .credentials.yaml |
hideCordisPanel |
false |
Hide the built-in "Cordis plugins" sidebar entry (dynamic-plugin admin panel) |
Key pool format
Keys are read from $DSH_HOME/.credentials.yaml (the standard DSH credentials file). A pool looks like:
OPENCODE_GO_API_KEY: sk-opencode-… # the currently active key
OPENCODE_GO_KEY_ACTIVE: go2 # which pool entry is active
OPENCODE_GO_KEY_go1: sk-opencode-…
OPENCODE_GO_KEY_go2: sk-opencode-…
OPENCODE_GO_KEY_go3: sk-opencode-…
Any OPENCODE_GO_KEY_<name> entry is discovered automatically — the number and names of keys are arbitrary. If you have only one key (no pool), just set OPENCODE_GO_API_KEY; the widget shows that single key.
Troubleshooting
| Symptom | Likely cause / fix |
|---|---|
Widget shows ! |
Snapshot fetch failed — confirm dsh web is running and /plugins/dsh-opencode-go-usage/snapshot responds |
Card shows Invalid key (401) |
That key is invalid or expired |
Card shows Network error |
Host cannot reach opencode.ai (proxy / offline / timeout) |
| Panel says "no keys configured" | .credentials.yaml has neither OPENCODE_GO_KEY_* nor OPENCODE_GO_API_KEY |
⚠ rate-limited |
That window's quota is exhausted server-side |
License
MIT
Links
More in this category
zhu1090093659/dsh-web-ui#packages/dsh-web-ui-all★ 2622
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.
ccch1mneyyy/dsh-TUI★ 1231
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/DSH-better-sidebar★ 1198
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
omdsh-dev/dsh-at-file★ 214
Codex-style `@file` mentions: search workspace files in the composer and attach their contents to prompts.
huiliyi37/dsh-tianshu-tui★ 159
A terminal UI (TUI) for DeepSeek Harness.
Nagi-ovo/dsh-visualize★ 114
In-conversation generative UI: the model renders interactive HTML cards into the chat stream, with streaming preview and sandboxed rendering.