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...
---
name: wdh
description: 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, paid feature requests, paid support tickets — settled in USDC on Base mainnet via x402 with no signup or API key. Use when the user wants any of these utilities and has an EVM wallet, or mentions x402, USDC, micropayment, pay-per-call, or any of the wdh.sh hostnames (files.wdh.sh, short.wdh.sh, charts.wdh.sh, md.wdh.sh, qr.wdh.sh, feedback.wdh.sh, support.wdh.sh). Costs $0.001–$5.00 USDC per call depending on tool.
version: 0.2.0
metadata:
openclaw:
requires:
env:
- WDH_WALLET_PRIVATE_KEY
anyBins:
- bunx
- npx
- wdh
primaryEnv: WDH_WALLET_PRIVATE_KEY
envVars:
- name: WDH_WALLET_PRIVATE_KEY
required: true
description: Hex-encoded EVM private key (starts with 0x) for a wallet funded with USDC on Base mainnet. Every CLI command signs an x402 payment with this key.
emoji: "🦸"
homepage: https://wdh.sh
---
# 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](https://x402.org) 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`](https://www.npmjs.com/package/@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](https://x402.org) for protocol detail.
## Services Overview
| 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 |
## Install
The CLI is published as [`@wdhsh/cli`](https://www.npmjs.com/package/@wdhsh/cli) on npm.
Use it via `bunx` or `npx` for zero-install, or install globally:
```bash
bunx @wdhsh/cli --help # zero-install, one-shot
npm i -g @wdhsh/cli && wdh --help
```
```bash
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.
```bash
bunx @wdhsh/cli files upload ./report.pdf --expires 7d
bunx @wdhsh/cli files upload ./build.tar.gz # 24h default TTL
```
| Flag | Required | Default | Description |
|---|---|---|---|
| `<path>` | yes | — | Path to the file to upload (up to 5 GB) |
| `--expires <ttl>` | 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 shortener
Returns a short `https://short.wdh.sh/<slug>` URL. **Links never expire by
default** — safe for business cards, printed materials, anywhere a permanent
redirect target is wanted.
```bash
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 |
|---|---|---|---|
| `<url>` | yes | — | URL to shorten (http or https only) |
| `--slug <s>` | no | auto-generated | Custom slug. Matches `^[A-Za-z0-9_-]{3,32}$` |
| `--expires <ttl>` | no | never | TTL like `24h`, `30d`. Omit and the link persists indefinitely |
### `charts plot` — Chart.js rendering
Proxies a [Chart.js](https://www.chartjs.org/) payload to the chartsplat
renderer. Writes raw PNG bytes to stdout (or to `--out` if provided).
```bash
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 <kind>` | yes | — | Chart.js chart type (`bar`, `line`, `pie`, `doughnut`, `radar`, etc.) |
| `--data <json>` | yes | — | Chart.js JSON payload as a string (parsed and forwarded as the request body) |
See [chartsplat docs](https://chartsplat.com/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.
```bash
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 |
|---|---|---|---|
| `<file>` | yes | — | Path to a local markdown file (max 1 MB) |
| `--title <t>` | no | `Shared markdown` | Page title for the rendered HTML |
| `--expires <ttl>` | 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 images
Renders a QR code as a PNG (default) or SVG.
```bash
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 |
|---|---|---|---|
| `<data>` | yes | — | Text or URL to encode (max 2048 chars) |
| `--size <px>` | no | `512` | Output size in pixels. Clamped to 64–2048 |
| `--format <png\|svg>` | no | `png` | Output format |
| `--out <file>` | no | stdout | Write 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.
```bash
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 |
|---|---|---|---|
| `<title>` | yes | — | Issue title (max 200 chars) |
| `--body <text>` | no | from stdin | Issue body (max 10 000 chars). Omit to read from stdin |
| `--contact <email>` | no | — | Optional reply-to address |
### `support` — Paid support tickets
Files 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.
```bash
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 |
|---|---|---|---|
| `<title>` | yes | — | Ticket title (prefixed with `[support]`, max 200 chars) |
| `--contact <email>` | yes | — | Reply-to email |
| `--body <text>` | no | from stdin | Ticket body (max 10 000 chars). Omit to read from stdin |
| `--severity <lvl>` | no | `medium` | `low \| medium \| high \| critical` → Linear priority 4\|3\|2\|1 |
## Output Handling
- Most commands print a **single line to stdout**: the resulting URL
(`files`, `short`, `md`, `feedback`, `support`) or the path that was
written (`qr --out <file>`).
- `qr` (without `--out`) and `charts` write **raw image bytes** to stdout —
always pipe to a file: `> chart.png`.
## Tips
- **Wallet hygiene.** Use a throwaway Base wallet for the agent — load it
with the budget you're willing to spend and revoke by deleting the key.
- **Idempotency for `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.
- **Short links are permanent by default.** Omitting `--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 are temporary.** `files upload` defaults to a **24-hour** TTL.
Pass `--expires 7d` for the maximum.
- **Charts payload.** The `--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 Handling
| 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 |
## Related
- CLI on npm: [`@wdhsh/cli`](https://www.npmjs.com/package/@wdhsh/cli)
- Per-service web docs: [wdh.sh/docs](https://wdh.sh/docs)
- The x402 protocol: [x402.org](https://x402.org)
- The standalone chartsplat-x402 skill (uses chartsplat directly without
WDH's proxy markup): `chartsplat-x402` on ClawHub.
don't have the plugin yet? install it then click "run inline in claude" again.
formalized 6-section structure with explicit decision points for wallet funding, file size validation, slug collisions, network timeouts, and parameter validation; added network timeout retry logic, edge cases (rate limits, auth expiry, empty results), x402 protocol clarification, and outcome signals tied to file system and blockchain state.
Use this skill when the user wants to upload files (≤5 GB), shorten URLs, render charts, publish markdown pages, generate QR codes, file paid feature requests, or open paid support tickets. every call is a micropayment in USDC on Base mainnet via the x402 protocol. no signup, no API keys, no subscriptions. costs $0.001, $5.00 per call depending on the tool. trigger when the user mentions any of these services or the wdh.sh domains (files.wdh.sh, short.wdh.sh, charts.wdh.sh, md.wdh.sh, qr.wdh.sh, feedback.wdh.sh, support.wdh.sh), or keywords like x402, USDC, micropayment, pay-per-call.
required environment variable:
WDH_WALLET_PRIVATE_KEY: hex-encoded EVM private key (starts with 0x) for a wallet funded with USDC on Base mainnet (eip155:8453). the CLI signs every x402 payment with this key. without it, commands fail immediately.required runtime dependencies:
@wdhsh/cli binary)setup:
export WDH_WALLET_PRIVATE_KEY=0x<hex_chars>npm i -g @wdhsh/cli or use bunx @wdhsh/cli for zero-installstep 1: validate environment and wallet
WDH_WALLET_PRIVATE_KEY env var is set and is a valid hex string starting with 0xstep 2: select tool based on user intent
step 3: prepare command arguments
^[A-Za-z0-9_-]{3,32}$)step 4: execute CLI command
bunx @wdhsh/cli <tool> <subcommand> <args>step 5: parse response and return result
--out: capture raw image bytes on stdout (PNG or SVG)--out: confirm the file was written to diskstep 6: handle errors and retries
--slug: slug collided 8 times, retry with different slug or omit slug30m, 24h, 7dif user has USDC on Base and a private key: proceed with steps 1-6 (normal flow).
else if user mentions a wallet but no private key is exported: ask user to export WDH_WALLET_PRIVATE_KEY and confirm the wallet is funded on Base (not Ethereum or other chains).
if user requests file upload: check file size. if ≤5 GB, proceed; else reject and ask user to split.
if user requests short link with custom slug: validate slug against regex ^[A-Za-z0-9_-]{3,32}$. if invalid, reject and provide example. if valid, proceed; if server returns 503 (slug collision), suggest auto-generated slug.
if user requests md publish: check file size. if ≤1 MB, proceed; else reject.
if user requests chart rendering: require both --type and --data flags. if either is missing, reject. validate JSON syntax of --data.
if user requests feedback or support: feedback requires only a title (cost $1); support requires title and --contact email (cost $5). if support has no --contact, reject and ask for email.
if user requests qr or charts output: if --out flag is provided, write image to file and confirm file path. else output raw bytes to stdout (user must redirect with > or pipe).
if payment fails due to insufficient funds: suggest funding wallet with more USDC. note that $1 covers thousands of small calls except feedback ($1) and support ($5).
if network timeout occurs: retry up to 3 times with exponential backoff. if all retries fail, report timeout and ask user to check internet connection and wallet network (Base mainnet).
if CLI reports invalid duration format: ask user to use formats like 30m, 24h, 7d. for files, max TTL is 7d; for md, max is 30d.
files upload: single line stdout containing a public download URL (https://files.wdh.sh/...). file expires after the specified TTL (default 24h, max 7d). cost: $0.001, $0.10 based on file size tier.
short create: single line stdout containing a short URL (https://short.wdh.sh/--expires to set an expiry. cost: $0.001 per call.
charts plot: raw PNG or SVG image bytes written to stdout or to file specified by --out. cost: $0.005 per call.
md publish: single line stdout containing a public markdown page URL (https://md.wdh.sh/...). page expires after the specified TTL (default 7d, max 30d). cost: $0.002 per call.
qr generate: raw PNG or SVG image bytes written to stdout or to file specified by --out. cost: $0.001 per call.
feedback: single line stdout containing a Linear issue URL created on the WDH team's tracker. issue title and body are visible to the WDH team. if --contact email is provided, the team can reply. cost: $1.00 per call.
support: single line stdout containing a Linear issue URL with a [support] prefix. issue is marked high-priority (based on --severity flag). --contact email is required and the team will follow up there. cost: $5.00 per call.
error states: stderr message describing the failure (e.g., "WDH_WALLET_PRIVATE_KEY env var is required", "402 retry fails", "failed: 413", "failed: 400", "invalid duration", "failed: 503"). http status codes and the underlying cause are included.
user sees one of the following:
--out): user confirms the file exists on disk with the correct format (PNG or SVG).--out): user pipes to a file and confirms the image opens correctly.