Coding

Pinme Share

Try it

Upload any local file or directory to PinMe (pinme.eth.limo) and instantly get a short shareable URL (*.pinit.eth.limo). Supports all file types: HTML pages,...

What it does

Upload any file or directory to PinMe (public IPFS) and get back a short URL.

The skill document

pinme-share

Upload any file or directory to PinMe (public IPFS) and get back a short *.pinit.eth.limo URL.


⚠️ Public-data warning — read before first use

  • PinMe runs on public IPFS: anything you upload is world-readable; anyone with the URL can open it.
  • CIDs are effectively undeletable: IPFS nodes cache content; --rm only removes the pin from your account — third-party copies may still exist.
  • 🚫 Never upload: internal company docs / client data / credentials / private info / unreleased material.
  • Every upload invocation prints a warning to stderr; pass --yes to skip it in automation.

🔑 First-time setup — configure your AppKey

PinMe v2.x requires authentication. The lookup order is:

  1. PINME_APPKEY env variable (highest priority, doesn't persist — good for CI / one-shot)
  2. pinme CLI already has an AppKey set → reuse directly
  3. Local file ~/.local/share/pinme-share/appkey.json exists → auto-applied to pinme CLI
  4. Otherwise → script returns error_type: auth_required and tells the user to grab an AppKey from https://pinme.eth.limo

Configure / replace the AppKey (persistent)

python3 scripts/upload_to_pinme.py --set-appkey 

Writes the key to both the pinme CLI and ~/.local/share/pinme-share/appkey.json (mode 0600). The local file is never committed to git or shipped in the published skill bundle.

Override the storage path (advanced)

export PINME_APPKEY_FILE=/custom/path/appkey.json
# or honour $XDG_DATA_HOME automatically:
export XDG_DATA_HOME=$HOME/my-xdg-data   # → $HOME/my-xdg-data/pinme-share/appkey.json

Inspect current configuration

python3 scripts/upload_to_pinme.py --show-appkey

📤 Upload

# Any single file
python3 scripts/upload_to_pinme.py /path/to/file.html
python3 scripts/upload_to_pinme.py /path/to/report.pdf

# A whole directory (no index.html required)
python3 scripts/upload_to_pinme.py /path/to/dist/

# Add --verbose to see progress for large files
python3 scripts/upload_to_pinme.py /path/to/video.mp4 --verbose

# Skip the privacy warning (for cron / automated pipelines)
python3 scripts/upload_to_pinme.py /path/to/file.html --yes

# Custom timeout (default: 60s + 2s/MB, floor 180s, ceiling 1800s)
python3 scripts/upload_to_pinme.py /path/to/big.zip --timeout 900

Output — the last line of stdout is always a single JSON object:

{"success": true, "url": "https://xxxx.pinit.eth.limo", "size_bytes": 12345, "timeout_used": 180}

📜 Browse upload history

python3 scripts/upload_to_pinme.py --list
python3 scripts/upload_to_pinme.py --list --limit 5
python3 scripts/upload_to_pinme.py --list --raw   # don't parse; return raw CLI text

Structured output:

{"success": true, "count": 3, "history": [
  {"name": "foo.html", "cid": "Qm...", "url": "https://xxxx.pinit.eth.limo", "size": "12 KB", "time": "2026-05-21 09:30"}
]}

🗑️ Unpin (remove from your pin list)

python3 scripts/upload_to_pinme.py --rm 

⚠️ Public IPFS copies cannot be truly deleted; this only removes the pin from your account.


💰 Wallet / quota

python3 scripts/upload_to_pinme.py --wallet

PinMe provides a free quota (~500 uploads). Past that it may charge — see https://pinme.eth.limo console.


🚪 Logout

python3 scripts/upload_to_pinme.py --logout

Clears both the pinme CLI session and ~/.local/share/pinme-share/appkey.json.


🧰 stdout / stderr contract

StreamPurpose
stdoutAlways exactly one JSON object on the final line — safe to pipe into jq
stderrProgress lines, privacy warnings, debug output — never breaks JSON parsing

Example:

URL=$(python3 scripts/upload_to_pinme.py /tmp/foo.html | jq -r '.url')

📋 Error code reference (for agent routing)

error_typeTriggerSuggested handling
auth_requiredAppKey missing / pinme reports login failurePrompt user to run --set-appkey or grab an AppKey
invalid_pathPath missing / unreadableAsk user to confirm the path
oversizeSingle file > 200 MB or directory > 1 GBSplit or use different storage
cli_missingpinme CLI install failed / not foundCheck Node.js / network / npm permissions
networkTimeout / DNS failure / connection refused / 5xxRetry or verify outbound connectivity
quota_exceededPinMe quota / wallet emptyTop up via PinMe console or switch account
url_not_foundUpload OK but no parseable URLInspect raw output (CLI format may have changed)
usageNo operation specifiedShow --help and ask the user what they want to do
invalid_appkeyAppKey passed to --set-appkey looks malformed (length < 20)Ask user to recheck and re-enter
conflicting_argsMultiple mutually-exclusive operations passed at once (e.g. path + --list)Call them separately, one operation per invocation
unknownFallbackerror field includes raw stderr

Exit codes: 0 success / 1 generic failure / 2 structured failure (read JSON error_type).


📦 Constraints & dependencies

  • Single file ≤ 200 MB, directory ≤ 1 GB (PinMe server limit)
  • Static files only (no server-side processing)
  • Node.js ≥ 16.13.0 (auto-checked)
  • pinme CLI (auto-installed via npm install -g pinme if missing)
  • PinMe AppKey (required)

🛠️ Pasted-content workflow

If the user pastes HTML content directly into chat, the agent should:

  1. Write it to /tmp/pinme_user_.html
  2. Invoke this script with that path
  3. Return the resulting URL

🔧 Environment variables

VariablePurposeExample
PINME_APPKEYOne-shot / CI override (highest priority, no persist)export PINME_APPKEY=abc123...
PINME_APPKEY_FILEOverride AppKey storage pathexport PINME_APPKEY_FILE=$HOME/.config/pinme/key.json
XDG_DATA_HOMEHonoured for default storage pathexport XDG_DATA_HOME=$HOME/my-xdg-data

Default storage: ${XDG_DATA_HOME:-$HOME/.local/share}/pinme-share/appkey.json.


🪪 Acknowledgements

  • PinMe for the IPFS pinning service and pinme CLI
  • Part of the html-tool-suite — HTML generation, publishing, and sharing skills

Changelog

v1.0.1

  • Fix (silent-failure): passing multiple mutually-exclusive operations (e.g. `` + --list) now returns conflicting_args instead of silently running only the first matched branch and dropping the rest.
  • Fix (security): --set-appkey with a too-short key no longer echoes the key fragment (key[:20]) into the error output; it now reports only the length.

v1.0.0

  • Initial open-source release (XDG-compliant storage, English docs, full-English CLI).

Related skills

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.

by johnpatternai21 installs8 stars

Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.

by Iván1 installs

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants

Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.

by Iván1 installs

More from songhonglei

Browse all skills

Recover lost agent session content and file changes from on-disk conversation logs. Streaming and OOM-safe on 700MB+ daily JSONL. Two commands: search.py for keyword search across recent sessions (with hit snippets, file-op listing, JSON for agent consumption); extract.py for pulling full write/edit content from a single session by ID prefix, with optional replay-rebuild for pure-edit sequences and safe restore-to-disk (refuses silent overwrites without --yes). Multi-agent aware via --agent main|all|a,b. Configurable data root via --root flag or SESSION_RECOVERY_ROOT env var (default ~/.openclaw/agents/). Trigger when user wants to find lost session content, recover files written by an agent, locate which session modified a file, search session history by keyword, or rebuild a file from an edit replay. Also triggers on 找回会话, 会话被覆盖, 历史会话搜索, 文件被删了, session 丢了, 找回某个文件, 重放编辑.

by blqbzf

小红书图文笔记自动发布技能。通过 ego-browser 自动化完成图片上传、标题填写、正文编辑、 话题标签、发布等全流程。附带 28 种多样式风格卡片生成器(含 3 种照片背景氛围主题), 卡片主题、布局、背景图、遮罩强度、模糊、颗粒等参数均可自由配置。 当用户要求发小红书、发布图文笔记、上传到小红书、小红书发帖或涉及小红书内容发布时触发此技能。 前置依赖:ego-browser (ego-lite) 已安装且正在运行,小红书账号已登录。

by songhonglei2 installs1 stars

Guided token optimization for AI agent workspaces. Triggers on phrases like "save tokens", "optimize tokens", "context window too large", "memory files too b...

by songhonglei2 installs1 stars

将 Markdown/纯文本内容智能分析、排版并导出为高分辨率精美长图或分享海报(内置 18 种视觉风格)。 当用户说「生成长图」「做海报」「文字转图片」「高颜值排版」「做大图」「make a poster」 「export as image」「generate image from text/markdown」等意图时触发本技能。

by songhonglei2 installs

Generic skill-quality auditor for any agent skill (Claude, OpenClaw, Cursor, etc.). Runs a 7-dimension static analysis (D1 process closure & idempotency, D2 tool/command conventions, D3 portability & defense, D4 skill usability, D5 security & op risk, D6 code & doc quality, D7 dependency & footprint) with explicit ERR / WARN severity, 120-point scoring (pass line 90 + zero ERR), and an opt-in `--fix` workflow that always backs up first. Two depths: L1 static (~2 min) and L2 dryRun (~5 min, read-only hub + reachability checks). Strict red lines — read-only by default, never executes the audited skill's writes. Use when the user asks to "audit a skill", "check skill quality", "is this skill ready to ship", "lint my skill", or runs this tool by name. Triggers also: "审计这个 Skill"、"检查 Skill 质量"、"Skill 能上线吗"、 "skill-deep-audit"、"审一下 xxx skill"。

by songhonglei1 installs1 stars

Turn any content — Markdown, plain text, images, tables, Excel (.xlsx), Word (.docx) — into a polished single-page HTML, pick one of 19 built-in themes, set the page Title and FavIcon, then publish it as a live page. When the input is already a well-designed HTML page (or an image with a clear layout), it switches to "layout inheritance" mode: the original layout is kept intact and only the colour theme is swapped, instead of tearing it apart and rebuilding. Use when the user says "turn this into a web page", "make this an HTML page", "convert this doc/table/Excel to HTML", "make it pretty", "把这个转成网页", "做成 HTML 页面", "内容转 HTML".

by songhonglei3 installs