Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.
Coding
Pinme Share
Try itUpload 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.
- Version: 1.0.1
- License: MIT
- Author: Evan Song · github.com/Songhonglei
- Repository: https://github.com/Songhonglei/html-tool-suite
⚠️ 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;
--rmonly 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
uploadinvocation prints a warning to stderr; pass--yesto skip it in automation.
🔑 First-time setup — configure your AppKey
PinMe v2.x requires authentication. The lookup order is:
PINME_APPKEYenv variable (highest priority, doesn't persist — good for CI / one-shot)pinmeCLI already has an AppKey set → reuse directly- Local file
~/.local/share/pinme-share/appkey.jsonexists → auto-applied topinmeCLI - Otherwise → script returns
error_type: auth_requiredand 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
| Stream | Purpose |
|---|---|
| stdout | Always exactly one JSON object on the final line — safe to pipe into jq |
| stderr | Progress 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_type | Trigger | Suggested handling |
|---|---|---|
auth_required | AppKey missing / pinme reports login failure | Prompt user to run --set-appkey or grab an AppKey |
invalid_path | Path missing / unreadable | Ask user to confirm the path |
oversize | Single file > 200 MB or directory > 1 GB | Split or use different storage |
cli_missing | pinme CLI install failed / not found | Check Node.js / network / npm permissions |
network | Timeout / DNS failure / connection refused / 5xx | Retry or verify outbound connectivity |
quota_exceeded | PinMe quota / wallet empty | Top up via PinMe console or switch account |
url_not_found | Upload OK but no parseable URL | Inspect raw output (CLI format may have changed) |
usage | No operation specified | Show --help and ask the user what they want to do |
invalid_appkey | AppKey passed to --set-appkey looks malformed (length < 20) | Ask user to recheck and re-enter |
conflicting_args | Multiple mutually-exclusive operations passed at once (e.g. path + --list) | Call them separately, one operation per invocation |
unknown | Fallback | error 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)
pinmeCLI (auto-installed vianpm install -g pinmeif missing)- PinMe AppKey (required)
🛠️ Pasted-content workflow
If the user pastes HTML content directly into chat, the agent should:
- Write it to
/tmp/pinme_user_.html - Invoke this script with that path
- Return the resulting URL
🔧 Environment variables
| Variable | Purpose | Example |
|---|---|---|
PINME_APPKEY | One-shot / CI override (highest priority, no persist) | export PINME_APPKEY=abc123... |
PINME_APPKEY_FILE | Override AppKey storage path | export PINME_APPKEY_FILE=$HOME/.config/pinme/key.json |
XDG_DATA_HOME | Honoured for default storage path | export 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
pinmeCLI - 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 returnsconflicting_argsinstead of silently running only the first matched branch and dropping the rest. - Fix (security):
--set-appkeywith 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
Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.
Save, search, and manage personal notes and knowledge bases in Get笔记 on explicit request.
Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.
Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.
Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.
More from songhonglei
Browse all skillsRecover 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 丢了, 找回某个文件, 重放编辑.
小红书图文笔记自动发布技能。通过 ego-browser 自动化完成图片上传、标题填写、正文编辑、 话题标签、发布等全流程。附带 28 种多样式风格卡片生成器(含 3 种照片背景氛围主题), 卡片主题、布局、背景图、遮罩强度、模糊、颗粒等参数均可自由配置。 当用户要求发小红书、发布图文笔记、上传到小红书、小红书发帖或涉及小红书内容发布时触发此技能。 前置依赖:ego-browser (ego-lite) 已安装且正在运行,小红书账号已登录。
Guided token optimization for AI agent workspaces. Triggers on phrases like "save tokens", "optimize tokens", "context window too large", "memory files too b...
将 Markdown/纯文本内容智能分析、排版并导出为高分辨率精美长图或分享海报(内置 18 种视觉风格)。 当用户说「生成长图」「做海报」「文字转图片」「高颜值排版」「做大图」「make a poster」 「export as image」「generate image from text/markdown」等意图时触发本技能。
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"。
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".