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.
eip155:8453). $1 of USDC covers thousands of calls except for feedback ($1) and support ($5).
WDH_WALLET_PRIVATE_KEY (a hex string starting with 0x).
@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.
| Tool | Cost (USDC) | Purpose |
|---|---|---|
| --- | --- | --- |
files | $0.001 – $0.10 (size-tiered) | Big-file transfer to a public expiring URL (≤5 GB, ≤7 days) |
short | $0.001 | URL shortener — links never expire by default |
charts | $0.005 | Chart rendering proxy (Chart.js payload → PNG) |
md | $0.002 | Publish a markdown file as a hosted HTML page (≤30 days) |
qr | $0.001 | QR code image (PNG or SVG) |
feedback | $1.00 | Paid feature request — opens a Linear issue on the WDH team's tracker |
support | $5.00 | Paid support ticket — opens a high-priority Linear issue |
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.
files upload — Big-file transferMultipart 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
| Flag | Required | Default | Description |
|---|---|---|---|
| --- | --- | --- | --- |
| yes | — | Path to the file to upload (up to 5 GB) |
--expires | no | 24h | TTL 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 shortenerReturns 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
| Flag | Required | Default | Description |
|---|---|---|---|
| --- | --- | --- | --- |
| yes | — | URL to shorten (http or https only) |
--slug | no | auto-generated | Custom slug. Matches ^[A-Za-z0-9_-]{3,32}$ |
--expires | no | never | TTL like 24h, 30d. Omit and the link persists indefinitely |
charts plot — Chart.js renderingProxies 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
| Flag | Required | Default | Description |
|---|---|---|---|
| --- | --- | --- | --- |
--type | yes | — | Chart.js chart type (bar, line, pie, doughnut, radar, etc.) |
--data | yes | — | Chart.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 pagesPublishes 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
| Flag | Required | Default | Description |
|---|---|---|---|
| --- | --- | --- | --- |
| yes | — | Path to a local markdown file (max 1 MB) |
--title | no | Shared markdown | Page title for the rendered HTML |
--expires | no | 7d | TTL 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 imagesRenders 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
| Flag | Required | Default | Description | |
|---|---|---|---|---|
| --- | --- | --- | --- | |
| yes | — | Text or URL to encode (max 2048 chars) | |
--size | no | 512 | Output size in pixels. Clamped to 64–2048 | |
`--format | svg>` | no | pngOutput format | | |
--out | no | stdout | Write the image to a file path instead |
feedback — Paid feature requestsFiles 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
| Flag | Required | Default | Description |
|---|---|---|---|
| --- | --- | --- | --- |
| yes | — | Issue title (max 200 chars) |
--body | no | from stdin | Issue body (max 10 000 chars). Omit to read from stdin |
--contact | no | — | Optional reply-to address |
support — Paid support ticketsFiles a $5.00 paid support ticket as a high-priority Linear issue.
Severity maps to Linear priority. --contact is required so the team can
follow up.
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
| Flag | Required | Default | Description | ||||||
|---|---|---|---|---|---|---|---|---|---|
| --- | --- | --- | --- | ||||||
| yes | — | Ticket title (prefixed with [support], max 200 chars) | ||||||
--contact | yes | — | Reply-to email | ||||||
--body | no | from stdin | Ticket body (max 10 000 chars). Omit to read from stdin | ||||||
--severity | no | medium | `low \ | medium \ | high \ | critical` → Linear priority 4\ | 3\ | 2\ | 1 |
(files, short, md, feedback, support) or the path that was
written (qr --out ).
qr (without --out) and charts write raw image bytes to stdout — always pipe to a file: > chart.png.
with the budget you're willing to spend and revoke by deleting the key.
feedback / support. Those endpoints accept an Idempotency-Key header server-side (24h cache). The CLI doesn't surface
that flag yet — re-running a command will file a duplicate Linear issue
and charge again.
--expires on short create means the redirect persists indefinitely — fine for
business cards, printed QR targets, social bios. Add --expires only
if you want it to lapse.
files upload defaults to a 24-hour TTL. Pass --expires 7d for the maximum.
--data JSON is a full Chart.js config (or just the inner data object — chartsplat accepts both). For OHLC /
candlestick charts pass { x, o, h, l, c } points.
| Error | Cause | Fix |
|---|---|---|
| --- | --- | --- |
WDH_WALLET_PRIVATE_KEY env var is required | Env var unset | export WDH_WALLET_PRIVATE_KEY=0x... |
402 retry fails / insufficient funds | Wallet has no USDC on Base | Top up; even $1 covers thousands of small calls |
failed: 413 on files upload | File >5 GB | Split the upload; 5 GB is the per-call max |
failed: 400 on md publish | Markdown >1 MB | Trim or split the document |
invalid duration | Bad --expires value | Use formats like 30m, 24h, 7d |
failed: 503 on short create --slug | 8 slug collisions in a row | Pick a different slug or let it auto-generate |
@wdhsh/cli WDH's proxy markup): chartsplat-x402 on ClawHub.
共 1 个版本