← 返回
未分类 Key

Wdh

Call any of seven paid-per-call CLI utilities on WDH.sh — big-file transfer (≤5 GB), URL shortening, Chart.js rendering, hosted markdown pages, QR codes, pai...
Call any of seven paid-per-call CLI utilities on WDH.sh — big-file transfer (≤5 GB), URL shortening, Chart.js rendering, hosted markdown pages, QR codes, pai...
workingdevshero
未分类 clawhub v0.2.0 1 版本 100000 Key: 需要
★ 0
Stars
📥 203
下载
💾 0
安装
1
版本
#latest

概述

WDH.sh

A family of seven small, paid-per-call HTTP services for agents and humans.

One CLI wraps every endpoint and signs payments automatically using the

agent's wallet — no signups, no API keys, no subscriptions. Every call is

settled in USDC on Base mainnet via the x402 protocol.

Prerequisites

  • An EVM wallet with USDC on Base mainnet (eip155:8453). $1 of USDC

covers thousands of calls except for feedback ($1) and support ($5).

  • Private key exported as WDH_WALLET_PRIVATE_KEY (a hex string starting

with 0x).

  • Node.js 20+ (the CLI ships as @wdhsh/cli on npm and runs anywhere Node runs).

The buyer never submits an on-chain transaction directly. The Coinbase

x402 facilitator handles settlement and pays gas. See

https://x402.org for protocol detail.

Services Overview

ToolCost (USDC)Purpose
---------
files$0.001 – $0.10 (size-tiered)Big-file transfer to a public expiring URL (≤5 GB, ≤7 days)
short$0.001URL shortener — links never expire by default
charts$0.005Chart rendering proxy (Chart.js payload → PNG)
md$0.002Publish a markdown file as a hosted HTML page (≤30 days)
qr$0.001QR code image (PNG or SVG)
feedback$1.00Paid feature request — opens a Linear issue on the WDH team's tracker
support$5.00Paid support ticket — opens a high-priority Linear issue

Install

The CLI is published as @wdhsh/cli on npm.

Use it via bunx or npx for zero-install, or install globally:

bunx @wdhsh/cli --help        # zero-install, one-shot
npm i -g @wdhsh/cli && wdh --help
export WDH_WALLET_PRIVATE_KEY=0x...

Once the env var is set, every command pays automatically. Without it the

CLI refuses to run.

Commands

files upload — Big-file transfer

Multipart upload to files.wdh.sh. Returns a public download URL.

bunx @wdhsh/cli files upload ./report.pdf --expires 7d
bunx @wdhsh/cli files upload ./build.tar.gz                   # 24h default TTL
FlagRequiredDefaultDescription
------------
yesPath to the file to upload (up to 5 GB)
--expires no24hTTL like 30m, 24h, 7d. Max 7 days

Size-tiered pricing: $0.001 (≤10 MB), $0.005 (≤100 MB), $0.02 (≤500 MB),

$0.05 (≤2 GB), $0.10 (≤5 GB).

short create — URL shortener

Returns a short https://short.wdh.sh/ URL. **Links never expire by

default** — safe for business cards, printed materials, anywhere a permanent

redirect target is wanted.

bunx @wdhsh/cli short create https://example.com/very/long/path
bunx @wdhsh/cli short create https://example.com --slug launch
bunx @wdhsh/cli short create https://example.com --expires 30d
FlagRequiredDefaultDescription
------------
yesURL to shorten (http or https only)
--slug noauto-generatedCustom slug. Matches ^[A-Za-z0-9_-]{3,32}$
--expires noneverTTL like 24h, 30d. Omit and the link persists indefinitely

charts plot — Chart.js rendering

Proxies a Chart.js payload to the chartsplat

renderer. Writes raw PNG bytes to stdout (or to --out if provided).

bunx @wdhsh/cli charts plot \
  --type bar \
  --data '{"labels":["Q1","Q2","Q3","Q4"],"datasets":[{"label":"Revenue","data":[50,75,60,90]}]}' \
  > chart.png
FlagRequiredDefaultDescription
------------
--type yesChart.js chart type (bar, line, pie, doughnut, radar, etc.)
--data yesChart.js JSON payload as a string (parsed and forwarded as the request body)

See chartsplat docs for the full schema and

supported chart types.

md publish — Hosted markdown pages

Publishes a local markdown file as a styled HTML page on md.wdh.sh.

Returns the public URL.

bunx @wdhsh/cli md publish ./notes.md
bunx @wdhsh/cli md publish ./post.md --title "Launch notes"
bunx @wdhsh/cli md publish ./scratch.md --expires 24h
FlagRequiredDefaultDescription
------------
yesPath to a local markdown file (max 1 MB)
--title noShared markdownPage title for the rendered HTML
--expires no7dTTL like 24h, 7d, 30d. Max 30 days

Renderer is markdown-it with HTML escaped and javascript: / data: /

vbscript: / file: links dropped.

qr generate — QR code images

Renders a QR code as a PNG (default) or SVG.

bunx @wdhsh/cli qr generate "https://wdh.sh" --out wdh.png
bunx @wdhsh/cli qr generate "wifi:T:WPA;S:...;P:..." --size 1024 > wifi.png
bunx @wdhsh/cli qr generate "ping" --format svg > ping.svg
FlagRequiredDefaultDescription
------------
yesText or URL to encode (max 2048 chars)
--size no512Output size in pixels. Clamped to 64–2048
`--format svg>`nopngOutput format
--out nostdoutWrite the image to a file path instead

feedback — Paid feature requests

Files a $1.00 paid feature request as a Linear issue on the WDH team's

tracker. Returns the issue URL.

bunx @wdhsh/cli feedback "Add Solana support" --body "We'd use this for..."
echo "long-form body here" | bunx @wdhsh/cli feedback "Title goes here"
bunx @wdhsh/cli feedback "Bug in qr" --body "..." --contact me@example.com
FlagRequiredDefaultDescription
------------
</code></td><td>yes</td><td>—</td><td>Issue title (max 200 chars)</td></tr><tr><td><code>--body <text></code></td><td>no</td><td>from stdin</td><td>Issue body (max 10 000 chars). Omit to read from stdin</td></tr><tr><td><code>--contact <email></code></td><td>no</td><td>—</td><td>Optional reply-to address</td></tr></tbody></table><h3><code>support</code> — Paid support tickets</h3><p>Files a $5.00 paid support ticket as a high-priority Linear issue.</p><p>Severity maps to Linear priority. <code>--contact</code> is required so the team can</p><p>follow up.</p><pre><code>bunx @wdhsh/cli support "Files endpoint 500s" \ --contact me@example.com \ --body "every /init returns 500 since 14:00 UTC" \ --severity high cat incident.md | bunx @wdhsh/cli support "x402 settlement timing out" \ --contact me@example.com --severity critical </code></pre><table><thead><tr><th>Flag</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td>---</td><td>---</td><td>---</td><td>---</td></tr><tr><td><code><title></code></td><td>yes</td><td>—</td><td>Ticket title (prefixed with <code>[support]</code>, max 200 chars)</td></tr><tr><td><code>--contact <email></code></td><td>yes</td><td>—</td><td>Reply-to email</td></tr><tr><td><code>--body <text></code></td><td>no</td><td>from stdin</td><td>Ticket body (max 10 000 chars). Omit to read from stdin</td></tr><tr><td><code>--severity <lvl></code></td><td>no</td><td><code>medium</code></td><td>`low \</td><td>medium \</td><td>high \</td><td>critical` → Linear priority 4\</td><td>3\</td><td>2\</td><td>1</td></tr></tbody></table><h2>Output Handling</h2><ul><li>Most commands print a <strong>single line to stdout</strong>: the resulting URL</li></ul><p> (<code>files</code>, <code>short</code>, <code>md</code>, <code>feedback</code>, <code>support</code>) or the path that was</p><p> written (<code>qr --out <file></code>).</p><ul><li><code>qr</code> (without <code>--out</code>) and <code>charts</code> write <strong>raw image bytes</strong> to stdout —</li></ul><p> always pipe to a file: <code>> chart.png</code>.</p><h2>Tips</h2><ul><li><strong>Wallet hygiene.</strong> Use a throwaway Base wallet for the agent — load it</li></ul><p> with the budget you're willing to spend and revoke by deleting the key.</p><ul><li><strong>Idempotency for <code>feedback</code> / <code>support</code>.</strong> Those endpoints accept an</li></ul><p> <code>Idempotency-Key</code> header server-side (24h cache). The CLI doesn't surface</p><p> that flag yet — re-running a command will file a duplicate Linear issue</p><p> and charge again.</p><ul><li><strong>Short links are permanent by default.</strong> Omitting <code>--expires</code> on</li></ul><p> <code>short create</code> means the redirect persists indefinitely — fine for</p><p> business cards, printed QR targets, social bios. Add <code>--expires</code> only</p><p> if you want it to lapse.</p><ul><li><strong>Files are temporary.</strong> <code>files upload</code> defaults to a <strong>24-hour</strong> TTL.</li></ul><p> Pass <code>--expires 7d</code> for the maximum.</p><ul><li><strong>Charts payload.</strong> The <code>--data</code> JSON is a full Chart.js config (or just</li></ul><p> the inner <code>data</code> object — chartsplat accepts both). For OHLC /</p><p> candlestick charts pass <code>{ x, o, h, l, c }</code> points.</p><h2>Error Handling</h2><table><thead><tr><th>Error</th><th>Cause</th><th>Fix</th></tr></thead><tbody><tr><td>---</td><td>---</td><td>---</td></tr><tr><td><code>WDH_WALLET_PRIVATE_KEY env var is required</code></td><td>Env var unset</td><td><code>export WDH_WALLET_PRIVATE_KEY=0x...</code></td></tr><tr><td>402 retry fails / <code>insufficient funds</code></td><td>Wallet has no USDC on Base</td><td>Top up; even $1 covers thousands of small calls</td></tr><tr><td><code>failed: 413</code> on <code>files upload</code></td><td>File >5 GB</td><td>Split the upload; 5 GB is the per-call max</td></tr><tr><td><code>failed: 400</code> on <code>md publish</code></td><td>Markdown >1 MB</td><td>Trim or split the document</td></tr><tr><td><code>invalid duration</code></td><td>Bad <code>--expires</code> value</td><td>Use formats like <code>30m</code>, <code>24h</code>, <code>7d</code></td></tr><tr><td><code>failed: 503</code> on <code>short create --slug</code></td><td>8 slug collisions in a row</td><td>Pick a different slug or let it auto-generate</td></tr></tbody></table><h2>Related</h2><ul><li>CLI on npm: <a href="https://www.npmjs.com/package/@wdhsh/cli" target="_blank" rel="noopener"><code>@wdhsh/cli</code></a></li><li>Per-service web docs: <a href="https://wdh.sh/docs" target="_blank" rel="noopener">wdh.sh/docs</a></li><li>The x402 protocol: <a href="https://x402.org" target="_blank" rel="noopener">x402.org</a></li><li>The standalone chartsplat-x402 skill (uses chartsplat directly without</li></ul><p> WDH's proxy markup): <code>chartsplat-x402</code> on ClawHub.</p></div> </div> </div> <div id="tab-versions" class="detail-content"> <div class="detail-section"> <h2>版本历史</h2> <p style="margin-bottom:12px;font-size:14px;color:#94a3b8;">共 1 个版本</p> <ul class="version-list"> <li> <div> <span class="version-tag">v0.2.0</span> <span style="font-size:11px;color:#5b6abf;margin-left:8px;background:#eef0ff;padding:1px 8px;border-radius:10px;">当前</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-05-23 23:43 安全 安全 </div> </li> </ul> </div> </div> <div id="tab-security" class="detail-content"> <div class="detail-section"> <h2>安全检测</h2> <div class="sec-grid"> <div class="sec-card"> <h4>腾讯云安全 (Keen)</h4> <div class="sec-status sec-safe"> 安全,无风险 </div> <a href="https://tix.qq.com/search/skill?keyword=ed8a9362edf81afce985c538576be161" target="_blank">查看报告</a> </div> <div class="sec-card"> <h4>腾讯云安全 (Sanbu)</h4> <div class="sec-status sec-safe"> 安全,无风险 </div> <a href="https://static.cloudsec.tencent.com/html-report-v2/2026/05/26/464507_9245fb84f2c0caba99494ff84f29c61d.html?q-sign-algorithm=sha1&q-ak=AKID8JMG1bzBC1dz96qNhssfFftujT1NCoFi&q-sign-time=1782345527%3B1813881527&q-key-time=1782345527%3B1813881527&q-header-list=host&q-url-param-list=&q-signature=c03f18070dee63d28f711d0c2ba5487e6b464cb6" target="_blank">查看报告</a> </div> </div> </div> </div> <!-- Recommended Skills --> <div style="margin-top:24px;"> <h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">🔗 相关推荐</h2> <div class="rec-grid"> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">dev-programming</span> <h3><a href="/s/youtube-api-skill">YouTube</a></h3> <div class="rec-owner">byungkyu</div> <div class="rec-desc">使用托管OAuth集成YouTube Data API,支持搜索视频、管理播放列表、获取频道数据及评论互动,适用于用户需要时使用此技能。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 142</span> <span style="color:#5b6abf;">📥 41,835</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">dev-programming</span> <h3><a href="/s/codeconductor">CodeConductor.ai</a></h3> <div class="rec-owner">larsonreever</div> <div class="rec-desc">AI驱动平台,提供快速全栈开发、智能体、工作流自动化及低代码AI集成的可扩展产品创建。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 75</span> <span style="color:#5b6abf;">📥 182,370</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">dev-programming</span> <h3><a href="/s/mcporter">Mcporter</a></h3> <div class="rec-owner">steipete</div> <div class="rec-desc">使用 mcporter CLI 直接列出、配置、认证及调用 MCP 服务器/工具(支持 HTTP 或 stdio),涵盖临时服务器、配置编辑及 CLI/类型生成功能。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 196</span> <span style="color:#5b6abf;">📥 67,915</span> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded',function(){ document.querySelectorAll('.detail-tab').forEach(function(btn){ btn.addEventListener('click',function(e){ var tab = this.getAttribute('data-tab'); document.querySelectorAll('.detail-tab').forEach(function(b){b.classList.remove('active')}); document.querySelectorAll('.detail-content').forEach(function(c){c.classList.remove('active')}); this.classList.add('active'); var el = document.getElementById('tab-'+tab); if(el) el.classList.add('active'); }); }); }); </script> <div class="footer"> <p>Skill工具集 © 2026</p> </div></body> </html>