Learned the hard way with Jina AI (v1.0.0 β v1.0.6). Follow this BEFORE uploading.
---
name: skill-name
description: One-line description
homepage: https://github.com/adhishthite/skill-name
metadata:
clawdbot:
emoji: "π"
requires:
env: ["ENV_VAR_NAME"]
primaryEnv: "ENV_VAR_NAME"
files: ["scripts/*"]
---- β
metadata.openclawβ ClawHub ignores this - β
metadata.clawdbotβ This is what ClawHub parses - β
requires.envsβ Wrong field name - β
requires.envβ Correct (matches built-in skills) - β
files: ["scripts/*"]β Declares scripts exist (avoids "instruction-only but has scripts" flag) - β
homepageβ Provides provenance, reduces suspicion score
- β
curl "https://api.com/${USER_INPUT}"β RCE via$(command)or backticks - β Sanitize ALL user input before interpolation:
SAFE_INPUT=$(printf '%s' "$INPUT" | python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.stdin.read().strip(), safe=""))')
curl "https://api.com/${SAFE_INPUT}"- β
Or use
--data-urlencodewith curl POST - β
Python scripts with
requestslibrary are inherently safe (no shell expansion) - β
JSON payloads with
jqescaping are safe
Every script MUST have:
# SECURITY MANIFEST:
# Environment variables accessed: VAR_NAME (only)
# External endpoints called: https://api.example.com/ (only)
# Local files read: none
# Local files written: none- β
set -euo pipefailat the top - β Check env vars exist before using
- β Validate input arguments
- β Proper error handling with exit codes
Include ALL of these:
- External Endpoints β table of every URL called + what data is sent
- Security & Privacy β what leaves the machine, what doesn't
- Model Invocation Note β explain autonomous invocation is standard, opt-out available
- Trust Statement β "By using this skill, data is sent to X. Only install if you trust X."
- SKILL.md (with proper frontmatter)
- README.md (with badges, installation, usage)
- scripts/ (all helper scripts)
- .gitignore
- LICENSE (keep in GitHub repo only)
- .git/
- .env files
- Frontmatter uses
clawdbotnotopenclaw -
requires.envlists all needed env vars -
filesfield declares script presence -
homepagepoints to GitHub repo - All shell scripts sanitize user input (no raw interpolation)
- All scripts have security manifest header
- All scripts have
set -euo pipefail - External Endpoints section in SKILL.md
- Security & Privacy section in SKILL.md
- Trust statement included
- No overclaiming capabilities (e.g., "bypasses paywalls")
- Test scripts locally before packaging
- Zip contains only SKILL.md, README.md, scripts/
The scan checks:
- Purpose & Capability β name/description match actual behavior
- Instruction Scope β only calls documented endpoints
- Install Mechanism β no auto-downloaders
- Credentials β declared env vars match what scripts actually use
- Persistence & Privilege β no
always:true, no OS restrictions abuse - Code Insights β shell injection, hardcoded secrets, exfiltration
This checklist is a living document. I update it every time I publish a new skill and learn something new. Star it to stay current.
Last updated: Feb 11, 2026 - after 6 iterations on Jina AI skill