upload-and-share

v2026.09.24

Upload files to the cloud and get shareable public URLs using stableupload.dev (x402 micropayments). USE FOR: - Uploading files to get public URLs - Sharing files via download links - Hosting images, documents, or any file type - Making files publicly accessible for 7 days or 6 months - Hosting static websites with custom domains TRIGGERS: - "upload this", "share this file", "get me a link" - "host this file", "make this downloadable" - "public URL", "download link", "put online" - "share file", "file hosting", "upload file" - "host site", "deploy site", "static site" ALWAYS use `npx agentcash@latest fetch` for stableupload.dev endpoints — never curl or WebFetch for the purchase step.

GitHub
安装命令
npx skhub add merit-systems/upload-and-share
Markdown
SKILL.md

Upload and Share via StableUpload

Upload any local file to S3-backed cloud storage via x402 micropayments. Returns a public URL. No API keys needed.

Setup

See rules/getting-started.md for installation and wallet setup.

Quick Reference

TierMax SizeRetentionCost
10mb10 MB6 months$0.02
100mb100 MB6 months$0.20
1gb1 GB6 months$2.00
short-10mb10 MB7 days$0.005
short-100mb100 MB7 days$0.02
short-1gb1 GB7 days$0.10
short-5gb5 GB7 days$0.50

Default tiers expire after 6 months; short-* tiers after 7 days. short-5gb is for file uploads only (not sites).

TaskEndpointPrice
Buy upload slothttps://stableupload.dev/api/uploadTier-based
List uploadsGET https://stableupload.dev/api/uploadsFree (auth)
Get upload detailsGET https://stableupload.dev/api/download/:uploadIdFree (auth)
Buy site slothttps://stableupload.dev/api/siteTier-based
Activate sitePOST https://stableupload.dev/api/site/activateFree (auth)
Update sitePUT https://stableupload.dev/api/siteFree (auth)
Renew sitehttps://stableupload.dev/api/site/renewTier-based
Preview domain DNSGET https://stableupload.dev/api/site/domain/preview?hostname=...Free (no auth)
Attach domainPOST https://stableupload.dev/api/site/domainFree (auth)
Detach domainDELETE https://stableupload.dev/api/site/domainFree (auth)
Domain statusGET https://stableupload.dev/api/site/domain/status?uploadId=...Free (auth)

Workflow

1. Check wallet balance

npx agentcash@latest balance

Ensure sufficient USDC balance for the chosen tier. If balance is low and the user needs funding details, run npx agentcash@latest accounts to get deposit links and wallet addresses.

2. Determine the tier

Pick the smallest tier that fits the file. Check file size first with ls -la or wc -c. Use a short-* tier when the file only needs to live for 7 days — they cost a fraction of the 6-month tiers.

TierMax SizeRetentionCost
10mb10 MB6 months$0.02
100mb100 MB6 months$0.20
1gb1 GB6 months$2.00
short-10mb10 MB7 days$0.005
short-100mb100 MB7 days$0.02
short-1gb1 GB7 days$0.10
short-5gb5 GB7 days$0.50

3. Buy the upload slot

npx agentcash@latest fetch https://stableupload.dev/api/upload -m POST -b '{"filename": "report.pdf", "contentType": "application/pdf", "tier": "10mb"}'

Parameters:

  • filename — name for the uploaded file (required)
  • contentType — MIME type (required, advisory for browser)
  • tier — "10mb", "100mb", "1gb", "short-10mb", "short-100mb", "short-1gb", or "short-5gb" (required)
  • policyTtlSeconds — optional upload URL expiration in seconds, 60–86400; use longer TTLs only when reserving an output slot for a downstream service

Response:

{
  "uploadId": "k7gm3nqp2",
  "uploadUrl": "https://f.stableupload.dev/k7gm3nqp2/report.pdf?t=...",
  "uploadMethod": "put",
  "uploadUrlExpiresAt": "2026-08-19T01:00:00.000Z",
  "publicUrl": "https://f.stableupload.dev/k7gm3nqp2/report.pdf",
  "expiresAt": "2027-02-19T00:00:00.000Z",
  "maxSize": 10485760,
  "curlExample": "curl -X PUT ..."
}

4. Upload the file via curl

Use Bash to PUT the file to the returned uploadUrl:

curl -s -X PUT "<uploadUrl>" -H "Content-Type: <mime>" --data-binary @/absolute/path/to/file

Critical: Use --data-binary (not -d) to preserve binary content. Use the absolute path.

The response includes a ready-made curlExample. If uploadMethod is "post", upload a multipart form to postUrl with postFields instead of a PUT.

5. Share the public URL

Present the publicUrl to the user. This URL is publicly accessible immediately and remains live for the tier's retention window (6 months for default tiers, 7 days for short-* tiers) — see expiresAt.

Common MIME Types

File TypeContent Type
PDFapplication/pdf
PNG imageimage/png
JPEG imageimage/jpeg
CSVtext/csv
JSONapplication/json
Plain texttext/plain
ZIP archiveapplication/zip
Excelapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Unknownapplication/octet-stream

Listing Previous Uploads

To list uploads for the current wallet:

npx agentcash@latest fetch https://stableupload.dev/api/uploads

Get Upload Details

npx agentcash@latest fetch https://stableupload.dev/api/download/k7gm3nqp2

Key Details

  • No API keys required — payment is the authentication
  • Upload URLs expire — see uploadUrlExpiresAt in the response; upload promptly, or set policyTtlSeconds (60–86400) at purchase to extend
  • Public URLs last the tier's retention window from purchase date — 6 months for default tiers, 7 days for short-* tiers
  • Any file type accepted — contentType is advisory for the browser, not a restriction
  • S3-backed — files stored on AWS S3 with public read access
  • Discovery endpoint: npx agentcash@latest discover https://stableupload.dev if you need to verify endpoints

Common Patterns

Upload a file the user just created: Skip discovery, go straight to wallet check + buy slot + upload.

Upload multiple files: Buy separate slots for each file. Slots can be purchased in parallel but uploads must use the correct uploadUrl for each.

User asks to "share" or "send" a file: Upload it and present the public URL. The URL can be shared anywhere.

Host images for emails: Upload the image, then reference the publicUrl in email HTML:

<img src="https://f.stableupload.dev/abc/photo.png" alt="Photo" />

Static Site Hosting

Host static sites (HTML/CSS/JS) with custom domains and automatic HTTPS.

Deploy a Site

1. Buy a site slot (paid, tier-based):

npx agentcash@latest fetch https://stableupload.dev/api/site -m POST -b '{"filename": "my-site.zip", "tier": "100mb"}'

Returns {uploadId, uploadUrl}.

2. Upload the zip:

curl -X PUT "$uploadUrl" -H "Content-Type: application/zip" --data-binary @site.zip

3. Activate the site (SIWX, free):

npx agentcash@latest fetch https://stableupload.dev/api/site/activate -m POST -b '{"uploadId": "..."}'

Returns {siteUrl, fileCount, files}. Site is live at https://{uploadId}.s.stableupload.dev/.

Update an Existing Site

Update for free: PUT /api/site to get a new upload URL, upload the new zip, then activate.

npx agentcash@latest fetch https://stableupload.dev/api/site -m PUT -b '{"uploadId": "...", "filename": "my-site.zip"}'

Then upload the new zip and call activate again.

Custom Domain

1. Preview the required DNS records (free, no auth):

npx agentcash@latest fetch "https://stableupload.dev/api/site/domain/preview?hostname=www.example.com"

Returns {hostname, dnsRecords}. Set these DNS records before attaching for instant SSL.

2. Attach the domain:

npx agentcash@latest fetch https://stableupload.dev/api/site/domain -m POST -b '{"uploadId": "...", "hostname": "www.example.com"}'

Creates the TLS cert and routes the hostname. Check status:

npx agentcash@latest fetch "https://stableupload.dev/api/site/domain/status?uploadId=..."

Poll until ssl is "active".

Detach a domain:

npx agentcash@latest fetch https://stableupload.dev/api/site/domain -m DELETE -b '{"uploadId": "...", "hostname": "www.example.com"}'

Renew a Site

npx agentcash@latest fetch https://stableupload.dev/api/site/renew -m POST -b '{"uploadId": "...", "count": 4}'

Extends the site by count x the original tier's retention window (e.g. 4 x 6 months on a default tier). Price = tier price x count ($0.005–$20.00).

Notes

  • Max 500 files per site
  • Tier limit applies to uncompressed size
  • Sites support all tiers except short-5gb; POST /api/site takes filename and tier only (no contentType)
  • Custom domains get automatic HTTPS via Cloudflare

Error Handling

  • Insufficient balance: Run npx agentcash@latest accounts to show deposit links and wallet addresses
  • File too large for tier: Suggest the next tier up
  • Upload URL expired: Buy a new slot (the previous payment is non-refundable)
  • curl fails: Verify the file path exists and the uploadUrl is correctly quoted
发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

2026年9月24日

分类

未分类

许可证

未指定

源路径

skills/upload-and-share

默认分支

master

最新提交

522d5da

Tree SHA

9734508