{"id":"ec62af5b-29a9-45d7-be58-b21c211d4040","entityType":"agent","slug":"clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge","name":"Openclaw Thumbnail Forge","canonicalUrl":"https://www.xpersona.co/agent/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge","canonicalPath":"/agent/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge","generatedAt":"2026-10-11T20:57:38.160Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T16:27:24.844Z","emptyReason":null},"description":"Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails... Skill: Openclaw Thumbnail Forge Owner: gopendrasharma89-tech Summary: Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails... Tags: ab-testing:0.3.0, auto-pick:0.3.0, branding:0.3.0, creator:0.3.0, ffmpeg:0.3.0, latest:0.3.0, pillow:0.3.0, shorts:0.3.0, thumbnail:0.3.0, video:0.3.0, youtube:0.3.0 Version history: v","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17cp87fy279ggwne1mqcb6675843tdy:openclaw-thumbnail-forge","sourceUrl":"https://clawhub.ai/gopendrasharma89-tech/openclaw-thumbnail-forge","homepage":"https://clawhub.ai/gopendrasharma89-tech/skills/openclaw-thumbnail-forge","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/gopendrasharma89-tech/openclaw-thumbnail-forge","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/gopendrasharma89-tech/skills/openclaw-thumbnail-forge","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails... "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T16:27:24.844Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T16:27:24.844Z","emptyReason":null},"stars":null,"forks":null,"downloads":1028,"packageName":null,"latestVersion":"0.3.0","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T16:27:24.691Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T16:27:24.844Z","lastCrawledAt":"2026-10-11T16:27:24.691Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T16:27:24.691Z","lastVerifiedAt":null,"highlights":[{"version":"0.3.0","createdAt":"2026-05-18T11:49:25.966Z","changelog":"v0.3.0: make_variants.py now supports --auto-pick. After generating the 4 A/B variants, it runs score_thumbnail.py on them, copies the highest-scoring variant to <output_dir>/winner.png, and writes <output_dir>/winner.json with the full ranking. Removes the manual second step in the typical workflow. Robustly parses scorer's nested winner block (winner.winner_file, winner.ranked[]) with fallback to results[]. No changes to existing CLI flags or variant filenames.","fileCount":10,"zipByteSize":24899},{"version":"0.2.0","createdAt":"2026-05-09T09:30:05.731Z","changelog":"v0.2.0 — adds scripts/score_thumbnail.py, a deterministic local click-likelihood scorer that ranks one or more finished thumbnails on six visual metrics (punch, focal_pop, color_punch, text_band, brightness, edge_density) and explains which metric drove each pairwise comparison. Pure Pillow + stdlib, no ML, no remote calls. Bug fixes: compose_thumbnail.py and make_variants.py now reject empty --title with a clear error instead of producing a textless thumbnail; compose_thumbnail.py catches PIL.UnidentifiedImageError on corrupt input and prints a clean message instead of leaking a traceback; pick_frames.py returns exit 2 (not 0) on ffprobe failure or zero-duration video so scripted pipelines work correctly; pick_frames.py now falls back to 3 evenly-spaced samples on very short clips and adds --relax-on-empty for one retry with loose thresholds; removed a redundant double-ffprobe call. No breaking changes — all v0.1.0 CLI flags and output filenames are unchanged.","fileCount":8,"zipByteSize":21679},{"version":"0.1.0","createdAt":"2026-05-02T06:55:36.117Z","changelog":"v0.1.0 — Initial release. A practical thumbnail generator for videos. Picks the best candidate frames from any video using sharpness (Laplacian variance), brightness, contrast, and ffmpeg scene-change scores, then composes professional thumbnails with bold title text, subtitle, gradient bar, optional logo overlay, and a chosen color scheme. Exports finished thumbnails at YouTube, Shorts, Instagram, X/Twitter, and LinkedIn sizes in one command, and can split-test four style variants for A/B testing click rate. Tools shipped: - scripts/check_deps.sh — verify ffmpeg/ffprobe/python3/Pillow are installed - scripts/pick_frames.py — extract and rank top-N frames with composite score + JSON report - scripts/compose_thumbnail.py — bold title + outline + shadow + gradient bar + optional logo, 5 color schemes (bold-yellow, clean-white, red-alert, cool-blue, tech-green), 3 positions (top/bottom/center) - scripts/export_sizes.py — multi-platform export (YouTube 1280x720, Shorts 1080x1920, Instagram 1080x1080, X 1200x675, LinkedIn 1200x627), cover or fit modes - scripts/make_variants.py — four A/B testable style variants from one source frame Honest scope: - 100% local, no API keys, no remote calls - Pure ffmpeg + Pillow (no AI/ML dependencies) - Frame ranking is statistical (Laplacian variance, brightness, contrast, scene-change), not semantic - Does not perform face detection, AI segmentation, or background removal - Does not write outside the directories the user provides - All Python helpers use subprocess.run with argument lists (never shell=True) and reject input/output paths containing shell metacharacters Tested end-to-end on a real synthetic 11-second video: - pick_frames.py picked top-5 frames with brightness/sharpness/contrast scoring - compose_thumbnail.py produced 1280x720 thumbnails with all 5 color schemes verified visually - export_sizes.py wrote all 5 platform sizes correctly (1280x720, 1080x1920, 1080x1080, 1200x675, 1200x627) - make_variants.py produced 4 A/B variants with different schemes and positions - Path injection attempt rejected - Pillow 12.2.0 verified working","fileCount":7,"zipByteSize":14919}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cp87fy279ggwne1mqcb6675843tdy:openclaw-thumbnail-forge","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T20:57:38.160Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-gopendrasharma89-tech-openclaw-thumbnail-forge/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T16:27:24.844Z","emptyReason":null},"readme":"Skill: Openclaw Thumbnail Forge\n\nOwner: gopendrasharma89-tech\n\nSummary: Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails...\n\nTags: ab-testing:0.3.0, auto-pick:0.3.0, branding:0.3.0, creator:0.3.0, ffmpeg:0.3.0, latest:0.3.0, pillow:0.3.0, shorts:0.3.0, thumbnail:0.3.0, video:0.3.0, youtube:0.3.0\n\nVersion history:\n\nv0.3.0 | 2026-05-18T11:49:25.966Z | user\n\nv0.3.0: make_variants.py now supports --auto-pick. After generating the 4 A/B variants, it runs score_thumbnail.py on them, copies the highest-scoring variant to <output_dir>/winner.png, and writes <output_dir>/winner.json with the full ranking. Removes the manual second step in the typical workflow. Robustly parses scorer's nested winner block (winner.winner_file, winner.ranked[]) with fallback to results[]. No changes to existing CLI flags or variant filenames.\n\nv0.2.0 | 2026-05-09T09:30:05.731Z | user\n\nv0.2.0 — adds scripts/score_thumbnail.py, a deterministic local click-likelihood scorer that ranks one or more finished thumbnails on six visual metrics (punch, focal_pop, color_punch, text_band, brightness, edge_density) and explains which metric drove each pairwise comparison. Pure Pillow + stdlib, no ML, no remote calls. Bug fixes: compose_thumbnail.py and make_variants.py now reject empty --title with a clear error instead of producing a textless thumbnail; compose_thumbnail.py catches PIL.UnidentifiedImageError on corrupt input and prints a clean message instead of leaking a traceback; pick_frames.py returns exit 2 (not 0) on ffprobe failure or zero-duration video so scripted pipelines work correctly; pick_frames.py now falls back to 3 evenly-spaced samples on very short clips and adds --relax-on-empty for one retry with loose thresholds; removed a redundant double-ffprobe call. No breaking changes — all v0.1.0 CLI flags and output filenames are unchanged.\n\nv0.1.0 | 2026-05-02T06:55:36.117Z | user\n\nv0.1.0 — Initial release.\n\nA practical thumbnail generator for videos. Picks the best candidate frames from any video using sharpness (Laplacian variance), brightness, contrast, and ffmpeg scene-change scores, then composes professional thumbnails with bold title text, subtitle, gradient bar, optional logo overlay, and a chosen color scheme. Exports finished thumbnails at YouTube, Shorts, Instagram, X/Twitter, and LinkedIn sizes in one command, and can split-test four style variants for A/B testing click rate.\n\nTools shipped:\n- scripts/check_deps.sh        — verify ffmpeg/ffprobe/python3/Pillow are installed\n- scripts/pick_frames.py       — extract and rank top-N frames with composite score + JSON report\n- scripts/compose_thumbnail.py — bold title + outline + shadow + gradient bar + optional logo, 5 color schemes (bold-yellow, clean-white, red-alert, cool-blue, tech-green), 3 positions (top/bottom/center)\n- scripts/export_sizes.py      — multi-platform export (YouTube 1280x720, Shorts 1080x1920, Instagram 1080x1080, X 1200x675, LinkedIn 1200x627), cover or fit modes\n- scripts/make_variants.py     — four A/B testable style variants from one source frame\n\nHonest scope:\n- 100% local, no API keys, no remote calls\n- Pure ffmpeg + Pillow (no AI/ML dependencies)\n- Frame ranking is statistical (Laplacian variance, brightness, contrast, scene-change), not semantic\n- Does not perform face detection, AI segmentation, or background removal\n- Does not write outside the directories the user provides\n- All Python helpers use subprocess.run with argument lists (never shell=True) and reject input/output paths containing shell metacharacters\n\nTested end-to-end on a real synthetic 11-second video:\n- pick_frames.py picked top-5 frames with brightness/sharpness/contrast scoring\n- compose_thumbnail.py produced 1280x720 thumbnails with all 5 color schemes verified visually\n- export_sizes.py wrote all 5 platform sizes correctly (1280x720, 1080x1920, 1080x1080, 1200x675, 1200x627)\n- make_variants.py produced 4 A/B variants with different schemes and positions\n- Path injection attempt rejected\n- Pillow 12.2.0 verified working\n\nArchive index:\n\nArchive v0.3.0: 10 files, 24899 bytes\n\nFiles: LICENSE (1078b), scripts/check_deps.sh (1089b), scripts/compose_thumbnail.py (14105b), scripts/export_sizes.py (3939b), scripts/make_variants.py (7213b), scripts/pick_frames.py (11476b), scripts/score_thumbnail.py (11281b), skill-card.md (2290b), SKILL.md (11649b), _meta.json (143b)\n\nFile v0.3.0:SKILL.md\n\n---\nname: openclaw-thumbnail-forge\ndescription: Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails with text overlays, gradient bars, and watermarks, and ranks A/B variants on objective click-likelihood metrics. Exports at YouTube, Shorts, Instagram, X, and LinkedIn sizes. Pure ffmpeg + Pillow, no AI APIs, no remote calls.\nlicense: MIT\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"ffmpeg\",\"ffprobe\",\"python3\"]},\"primaryEnv\":null,\"homepage\":\"https://clawhub.ai/gopendrasharma89-tech/openclaw-thumbnail-forge\"}}\n---\n\n# openclaw-thumbnail-forge\n\nv0.3.0\n\nA practical thumbnail generator for videos. Builds the kind of professional-looking thumbnails creators normally make in Photoshop or Canva, but as a local CLI workflow with no API keys, no online services, and no AI dependencies.\n\n## What this skill does\n\n- `scripts/check_deps.sh` — verify `ffmpeg`, `ffprobe`, `python3` (and the `Pillow` Python package) are installed.\n- `scripts/pick_frames.py` — extract candidate frames from a video and rank them by a composite score combining sharpness, brightness, contrast, and ffmpeg scene-change scores. Outputs the top-N frames as PNG files plus a JSON report.\n- `scripts/compose_thumbnail.py` — turn one source frame into a finished thumbnail with bold title text, subtitle, gradient bar, optional logo overlay, and auto contrast boost. Supports custom fonts and color schemes.\n- `scripts/export_sizes.py` — re-export a finished thumbnail to all common platform sizes in one command (YouTube, Shorts, Instagram square, X/Twitter, LinkedIn).\n- `scripts/make_variants.py` — generate four A/B-testable variants of the same thumbnail (different color schemes, text placements, contrast levels) for split-testing. NEW in v0.3.0: pass `--auto-pick` to immediately score the four variants with `score_thumbnail.py`, copy the winner to `<output_dir>/winner.png`, and write a `winner.json` with the full ranking. One command, one decision.\n- `scripts/score_thumbnail.py` (NEW in v0.2.0) — score one or more finished thumbnails on six objective visual metrics and pick the most likely click-winner. Gives a numeric click-likelihood score (0-100) per thumbnail and an explanation of which metrics drove the result.\n\n## What this skill does not do\n\nTo set expectations honestly:\n\n- It does not use AI subject detection or face recognition. Frame ranking and click-likelihood scoring are statistical, not semantic.\n- It does not download fonts, stock photos, or any remote asset. You provide your own font path or use the system default.\n- It does not perform OCR, transcription, or generative editing.\n- It does not write outside the directory you provide.\n- The click-likelihood scorer is a deterministic heuristic, not a real ML CTR model. It captures widely-cited thumbnail design rules (punch, focal pop, color punch, text band, brightness, edge density). Treat its output as a tie-breaker, not a guarantee.\n\n## Required dependencies\n\n```bash\nbash scripts/check_deps.sh\n```\n\nVerifies `ffmpeg`, `ffprobe`, `python3`, and that `PIL` (Pillow) is importable. Pillow is the only Python dependency:\n\n```bash\npip install Pillow\n```\n\n## Workflows\n\n### 1. Pick the best candidate frames from a video\n\n```bash\npython3 scripts/pick_frames.py input.mp4 ./frames/ \\\n  --top 10 --interval 2.0\n```\n\nExtracts a frame every 2 seconds, scores each one, and writes the top 10 as `frames/frame_001.png` through `frames/frame_010.png` plus a `frames/report.json` with per-frame scores.\n\nTunable flags:\n- `--interval <seconds>` — sampling interval (default 2.0)\n- `--top <N>` — how many top frames to keep (default 10)\n- `--min-brightness <0-255>` / `--max-brightness <0-255>` — reject frames that are too dark or blown out\n- `--min-sharpness <float>` — reject blurry frames\n- `--relax-on-empty` (NEW in v0.2.0) — if no frame passes the filters (very short clip, very dark video, single-subject still), retry once with very loose thresholds so you still get at least one candidate\n\nFor a video shorter than `2 * interval`, the script now automatically falls back to 3 evenly-spaced samples instead of returning zero candidates.\n\n### 2. Compose a finished thumbnail from a frame\n\n```bash\npython3 scripts/compose_thumbnail.py frames/frame_003.png thumb.png \\\n  --title \"10 ffmpeg Tricks I Wish I Knew Sooner\" \\\n  --subtitle \"A practical tour\" \\\n  --color-scheme bold-yellow \\\n  --position bottom\n```\n\nColor schemes shipped: `bold-yellow`, `clean-white`, `red-alert`, `cool-blue`, `tech-green`. Each scheme defines title color, outline color, shadow, and gradient bar opacity.\n\nPosition options: `top`, `bottom`, `center`. The script auto-fits the title size to the available width and adds a readable gradient bar behind the text so the thumbnail reads at small sizes too.\n\nOptional logo overlay:\n\n```bash\npython3 scripts/compose_thumbnail.py frames/frame_003.png thumb.png \\\n  --title \"Your Title\" \\\n  --logo logo.png --logo-corner top-right --logo-scale 0.12\n```\n\nIn v0.2.0, the script now rejects an empty `--title \"\"` (instead of silently producing a textless thumbnail) and prints a clean error if the input image is corrupt or unreadable (instead of leaking a Python traceback).\n\n### 3. Export to all platform sizes at once\n\n```bash\npython3 scripts/export_sizes.py thumb.png ./out/\n```\n\nWrites:\n- `out/youtube_1280x720.png`\n- `out/shorts_1080x1920.png`\n- `out/instagram_1080x1080.png`\n- `out/x_1200x675.png`\n- `out/linkedin_1200x627.png`\n\n### 4. Generate A/B variants\n\n```bash\npython3 scripts/make_variants.py frames/frame_003.png ./variants/ \\\n  --title \"10 ffmpeg Tricks\" \\\n  --subtitle \"A practical tour\"\n```\n\nWrites 4 variants with different color schemes and positions, ideal for click-rate split testing.\n\nNEW in v0.3.0 — add `--auto-pick` to produce the variants AND immediately pick the winner in one command:\n\n```bash\npython3 scripts/make_variants.py frames/frame_003.png ./variants/ \\\n  --title \"10 ffmpeg Tricks\" \\\n  --subtitle \"A practical tour\" \\\n  --auto-pick\n```\n\nThis writes the 4 variants plus a copy of the highest-scoring variant as `./variants/winner.png` and a `./variants/winner.json` with the full ranking. The original four `variant_*.png` files are preserved so you can still pick a different one if you disagree with the score.\n\n### 5. Score finished thumbnails on click-likelihood (NEW in v0.2.0)\n\n```bash\npython3 scripts/score_thumbnail.py variants/*.png\n```\n\nScores every thumbnail on six objective metrics and prints a ranked list with the winner highlighted:\n\n| Sub-score | What it measures |\n|---|---|\n| `punch` | Global luminance contrast |\n| `focal_pop` | Variance of per-tile mean luminance — high when there is one obvious focal area |\n| `color_punch` | Saturation mean + saturation stddev (combined) |\n| `text_band` | Presence of a high-contrast horizontal text band (long run of high-edge-density rows) |\n| `brightness` | Distance from the optimal mid-tone (penalty for too dark or washed-out) |\n| `edge_density` | Mean edge magnitude — peaks at mid values, penalised at extremes |\n\nEach sub-score is normalised to `[0, 100]` and combined with weights `0.18 / 0.22 / 0.15 / 0.20 / 0.12 / 0.13`. Final `click_score` is in `[0, 100]`.\n\nWhen given two or more thumbnails, the script also prints an explanation: which metric drove the gap, by how much, for each pairwise comparison vs the winner.\n\nJSON mode:\n\n```bash\npython3 scripts/score_thumbnail.py variants/*.png --output ranking.json --json\n```\n\n## Full pipeline example\n\n```bash\n# 1) Find the best candidate frames\npython3 scripts/pick_frames.py my_video.mp4 ./frames/ --top 5 --interval 1.5\n\n# 2) Generate four variants from the top frame\npython3 scripts/make_variants.py frames/frame_001.png ./variants/ \\\n  --title \"Your Title Here\" --subtitle \"Optional subtitle\"\n\n# 3) Score the variants and pick the click-winner\npython3 scripts/score_thumbnail.py variants/*.png --output ranking.json\n\n# 4) Export the chosen variant to every platform size\npython3 scripts/export_sizes.py variants/variant_b_clean_white_top.png ./out/\n```\n\n## Exit codes\n\n| Code | Meaning |\n|---|---|\n| 0 | success |\n| 1 | partial failure (no frames passed filters; no scorable images among inputs) |\n| 2 | error (bad arguments, unsafe path, missing or corrupt input, ffmpeg/ffprobe failure) |\n\n## Safety properties\n\n- All Python helpers use `subprocess.run` with argument lists (never `shell=True`) and reject input/output paths containing shell metacharacters via a strict regex allowlist.\n- The skill never reads or writes outside the input/output paths the user provides.\n- No environment variables are read for credentials. No tokens, secrets, or API keys are required.\n- No remote calls of any kind. The skill only invokes locally installed `ffmpeg` and the Python `Pillow` library.\n\n## Known limitations\n\n- Frame scoring and thumbnail click-likelihood scoring are heuristic, not AI-based. They are not aware of \"is the subject's face visible\" — they maximise objective image-quality signals and proxies for visual hierarchy.\n- Default font is the system default if `--font` is not provided. If no usable font is found, the script falls back to Pillow's bitmap font, which looks plain. Pass `--font` for nice typography.\n- `compose_thumbnail.py` does not do automatic background removal. If you want isolated subjects, do the subject-cutout step in a different tool first.\n\n## v0.3.0 changes\n\n- `scripts/make_variants.py` now accepts `--auto-pick`. After producing the four A/B variants, it runs `scripts/score_thumbnail.py` on them, copies the highest-scoring variant to `<output_dir>/winner.png`, and writes `<output_dir>/winner.json` with the full ranking and reasoning. Removes the manual second step in the typical workflow.\n- Robustly parses the scorer's nested `winner` block (`winner.winner_file`, `winner.ranked[]`) and falls back to the raw `results[]` array if the structure changes in future scorer versions.\n- No changes to existing CLI flags; `--auto-pick` is purely additive. The four variant filenames (`variant_a_...png`, `variant_b_...png`, `variant_c_...png`, `variant_d_...png`) are unchanged.\n\n## v0.2.0 changes\n\n**New feature**\n\n- `scripts/score_thumbnail.py` — deterministic local click-likelihood scorer. Scores one or more finished thumbnails on six visual metrics (punch, focal pop, color punch, text band, brightness, edge density) and ranks them. Pure Pillow + standard library, no ML, no remote calls.\n\n**Bug fixes**\n\n- `compose_thumbnail.py` and `make_variants.py` now reject empty `--title \"\"` with a clear error instead of silently producing a textless thumbnail.\n- `compose_thumbnail.py` now catches `PIL.UnidentifiedImageError` on a corrupt or non-image input and prints a clean one-line error instead of leaking a Python traceback.\n- `pick_frames.py` now correctly returns exit code 2 (not 0) when `ffprobe` fails on a non-video input, when the video duration is zero, or when the input path contains shell metacharacters. Pipelines that key off exit codes will work correctly now.\n- `pick_frames.py` no longer silently produces zero frames on a very short clip (`< 2 * interval`). It now falls back to 3 evenly-spaced samples for short clips, and the new `--relax-on-empty` flag retries once with very loose thresholds when even the loose default produces no candidates.\n- Removed a redundant double-ffprobe call in `probe_duration`.\n\n**No breaking changes**: existing CLI flags, output filenames, scoring formulas, and verdict thresholds are unchanged. v0.1.0 scripts and pipelines continue to work.\n\n## License\n\nMIT. See `LICENSE`.\n\nFile v0.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn7fkwsa5knkdkkachj1p7rwr9843xts\",\n  \"slug\": \"openclaw-thumbnail-forge\",\n  \"version\": \"0.3.0\",\n  \"publishedAt\": 1779104965966\n}\n\nFile v0.3.0:skill-card.md\n\n## Description:\n\nLocal thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails with text overlays, gradient bars, and watermarks, and ranks A/B variants on objective click-likelihood metrics.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[gopendrasharma89-tech](https://clawhub.ai/user/gopendrasharma89-tech)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nCreators, marketers, and developers use this skill to turn local video frames into platform-ready thumbnails, generate A/B variants, and choose a heuristic winner without remote services or AI APIs.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The workflow invokes local media tools and writes generated PNG or JSON files to output paths.\n\nMitigation: Run scripts as a normal user, keep PATH limited to trusted directories, and choose output directories where overwriting generated files is acceptable.\n\nRisk: Pillow is required for image processing.\n\nMitigation: Install Pillow in a virtual environment from a trusted package index.\n\nRisk: Frame and click-likelihood scores are deterministic heuristics, not semantic review or real CTR prediction.\n\nMitigation: Treat rankings as a tie-breaker and review selected thumbnails before publication.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/gopendrasharma89-tech/skills/openclaw-thumbnail-forge)\n- [OpenClaw homepage](https://clawhub.ai/gopendrasharma89-tech/openclaw-thumbnail-forge)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, shell commands, code, configuration, text]\n\n**Output Format:** [Markdown guidance with CLI commands and generated PNG or JSON file outputs]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces local image assets, frame reports, variant rankings, and winner metadata in user-specified output directories.]\n\n## Skill Version(s):\n\n0.3.0 (source: server release metadata and SKILL.md)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.3.0:LICENSE\n\nMIT License\n\nCopyright (c) 2026 gopendrasharma89-tech\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.2.0: 8 files, 21679 bytes\n\nFiles: scripts/check_deps.sh (1089b), scripts/compose_thumbnail.py (14105b), scripts/export_sizes.py (3939b), scripts/make_variants.py (4268b), scripts/pick_frames.py (11476b), scripts/score_thumbnail.py (11281b), SKILL.md (10141b), _meta.json (143b)\n\nFile v0.2.0:SKILL.md\n\n---\nname: openclaw-thumbnail-forge\ndescription: Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails with text overlays, gradient bars, and watermarks, and ranks A/B variants on objective click-likelihood metrics. Exports at YouTube, Shorts, Instagram, X, and LinkedIn sizes. Pure ffmpeg + Pillow, no AI APIs, no remote calls.\nlicense: MIT\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"ffmpeg\",\"ffprobe\",\"python3\"]},\"primaryEnv\":null,\"homepage\":\"https://clawhub.ai/gopendrasharma89-tech/openclaw-thumbnail-forge\"}}\n---\n\n# openclaw-thumbnail-forge\n\nv0.2.0\n\nA practical thumbnail generator for videos. Builds the kind of professional-looking thumbnails creators normally make in Photoshop or Canva, but as a local CLI workflow with no API keys, no online services, and no AI dependencies.\n\n## What this skill does\n\n- `scripts/check_deps.sh` — verify `ffmpeg`, `ffprobe`, `python3` (and the `Pillow` Python package) are installed.\n- `scripts/pick_frames.py` — extract candidate frames from a video and rank them by a composite score combining sharpness, brightness, contrast, and ffmpeg scene-change scores. Outputs the top-N frames as PNG files plus a JSON report.\n- `scripts/compose_thumbnail.py` — turn one source frame into a finished thumbnail with bold title text, subtitle, gradient bar, optional logo overlay, and auto contrast boost. Supports custom fonts and color schemes.\n- `scripts/export_sizes.py` — re-export a finished thumbnail to all common platform sizes in one command (YouTube, Shorts, Instagram square, X/Twitter, LinkedIn).\n- `scripts/make_variants.py` — generate four A/B-testable variants of the same thumbnail (different color schemes, text placements, contrast levels) for split-testing.\n- `scripts/score_thumbnail.py` (NEW in v0.2.0) — score one or more finished thumbnails on six objective visual metrics and pick the most likely click-winner. Gives a numeric click-likelihood score (0-100) per thumbnail and an explanation of which metrics drove the result.\n\n## What this skill does not do\n\nTo set expectations honestly:\n\n- It does not use AI subject detection or face recognition. Frame ranking and click-likelihood scoring are statistical, not semantic.\n- It does not download fonts, stock photos, or any remote asset. You provide your own font path or use the system default.\n- It does not perform OCR, transcription, or generative editing.\n- It does not write outside the directory you provide.\n- The click-likelihood scorer is a deterministic heuristic, not a real ML CTR model. It captures widely-cited thumbnail design rules (punch, focal pop, color punch, text band, brightness, edge density). Treat its output as a tie-breaker, not a guarantee.\n\n## Required dependencies\n\n```bash\nbash scripts/check_deps.sh\n```\n\nVerifies `ffmpeg`, `ffprobe`, `python3`, and that `PIL` (Pillow) is importable. Pillow is the only Python dependency:\n\n```bash\npip install Pillow\n```\n\n## Workflows\n\n### 1. Pick the best candidate frames from a video\n\n```bash\npython3 scripts/pick_frames.py input.mp4 ./frames/ \\\n  --top 10 --interval 2.0\n```\n\nExtracts a frame every 2 seconds, scores each one, and writes the top 10 as `frames/frame_001.png` through `frames/frame_010.png` plus a `frames/report.json` with per-frame scores.\n\nTunable flags:\n- `--interval <seconds>` — sampling interval (default 2.0)\n- `--top <N>` — how many top frames to keep (default 10)\n- `--min-brightness <0-255>` / `--max-brightness <0-255>` — reject frames that are too dark or blown out\n- `--min-sharpness <float>` — reject blurry frames\n- `--relax-on-empty` (NEW in v0.2.0) — if no frame passes the filters (very short clip, very dark video, single-subject still), retry once with very loose thresholds so you still get at least one candidate\n\nFor a video shorter than `2 * interval`, the script now automatically falls back to 3 evenly-spaced samples instead of returning zero candidates.\n\n### 2. Compose a finished thumbnail from a frame\n\n```bash\npython3 scripts/compose_thumbnail.py frames/frame_003.png thumb.png \\\n  --title \"10 ffmpeg Tricks I Wish I Knew Sooner\" \\\n  --subtitle \"A practical tour\" \\\n  --color-scheme bold-yellow \\\n  --position bottom\n```\n\nColor schemes shipped: `bold-yellow`, `clean-white`, `red-alert`, `cool-blue`, `tech-green`. Each scheme defines title color, outline color, shadow, and gradient bar opacity.\n\nPosition options: `top`, `bottom`, `center`. The script auto-fits the title size to the available width and adds a readable gradient bar behind the text so the thumbnail reads at small sizes too.\n\nOptional logo overlay:\n\n```bash\npython3 scripts/compose_thumbnail.py frames/frame_003.png thumb.png \\\n  --title \"Your Title\" \\\n  --logo logo.png --logo-corner top-right --logo-scale 0.12\n```\n\nIn v0.2.0, the script now rejects an empty `--title \"\"` (instead of silently producing a textless thumbnail) and prints a clean error if the input image is corrupt or unreadable (instead of leaking a Python traceback).\n\n### 3. Export to all platform sizes at once\n\n```bash\npython3 scripts/export_sizes.py thumb.png ./out/\n```\n\nWrites:\n- `out/youtube_1280x720.png`\n- `out/shorts_1080x1920.png`\n- `out/instagram_1080x1080.png`\n- `out/x_1200x675.png`\n- `out/linkedin_1200x627.png`\n\n### 4. Generate A/B variants\n\n```bash\npython3 scripts/make_variants.py frames/frame_003.png ./variants/ \\\n  --title \"10 ffmpeg Tricks\" \\\n  --subtitle \"A practical tour\"\n```\n\nWrites 4 variants with different color schemes and positions, ideal for click-rate split testing.\n\n### 5. Score finished thumbnails on click-likelihood (NEW in v0.2.0)\n\n```bash\npython3 scripts/score_thumbnail.py variants/*.png\n```\n\nScores every thumbnail on six objective metrics and prints a ranked list with the winner highlighted:\n\n| Sub-score | What it measures |\n|---|---|\n| `punch` | Global luminance contrast |\n| `focal_pop` | Variance of per-tile mean luminance — high when there is one obvious focal area |\n| `color_punch` | Saturation mean + saturation stddev (combined) |\n| `text_band` | Presence of a high-contrast horizontal text band (long run of high-edge-density rows) |\n| `brightness` | Distance from the optimal mid-tone (penalty for too dark or washed-out) |\n| `edge_density` | Mean edge magnitude — peaks at mid values, penalised at extremes |\n\nEach sub-score is normalised to `[0, 100]` and combined with weights `0.18 / 0.22 / 0.15 / 0.20 / 0.12 / 0.13`. Final `click_score` is in `[0, 100]`.\n\nWhen given two or more thumbnails, the script also prints an explanation: which metric drove the gap, by how much, for each pairwise comparison vs the winner.\n\nJSON mode:\n\n```bash\npython3 scripts/score_thumbnail.py variants/*.png --output ranking.json --json\n```\n\n## Full pipeline example\n\n```bash\n# 1) Find the best candidate frames\npython3 scripts/pick_frames.py my_video.mp4 ./frames/ --top 5 --interval 1.5\n\n# 2) Generate four variants from the top frame\npython3 scripts/make_variants.py frames/frame_001.png ./variants/ \\\n  --title \"Your Title Here\" --subtitle \"Optional subtitle\"\n\n# 3) Score the variants and pick the click-winner\npython3 scripts/score_thumbnail.py variants/*.png --output ranking.json\n\n# 4) Export the chosen variant to every platform size\npython3 scripts/export_sizes.py variants/variant_b_clean_white_top.png ./out/\n```\n\n## Exit codes\n\n| Code | Meaning |\n|---|---|\n| 0 | success |\n| 1 | partial failure (no frames passed filters; no scorable images among inputs) |\n| 2 | error (bad arguments, unsafe path, missing or corrupt input, ffmpeg/ffprobe failure) |\n\n## Safety properties\n\n- All Python helpers use `subprocess.run` with argument lists (never `shell=True`) and reject input/output paths containing shell metacharacters via a strict regex allowlist.\n- The skill never reads or writes outside the input/output paths the user provides.\n- No environment variables are read for credentials. No tokens, secrets, or API keys are required.\n- No remote calls of any kind. The skill only invokes locally installed `ffmpeg` and the Python `Pillow` library.\n\n## Known limitations\n\n- Frame scoring and thumbnail click-likelihood scoring are heuristic, not AI-based. They are not aware of \"is the subject's face visible\" — they maximise objective image-quality signals and proxies for visual hierarchy.\n- Default font is the system default if `--font` is not provided. If no usable font is found, the script falls back to Pillow's bitmap font, which looks plain. Pass `--font` for nice typography.\n- `compose_thumbnail.py` does not do automatic background removal. If you want isolated subjects, do the subject-cutout step in a different tool first.\n\n## v0.2.0 changes\n\n**New feature**\n\n- `scripts/score_thumbnail.py` — deterministic local click-likelihood scorer. Scores one or more finished thumbnails on six visual metrics (punch, focal pop, color punch, text band, brightness, edge density) and ranks them. Pure Pillow + standard library, no ML, no remote calls.\n\n**Bug fixes**\n\n- `compose_thumbnail.py` and `make_variants.py` now reject empty `--title \"\"` with a clear error instead of silently producing a textless thumbnail.\n- `compose_thumbnail.py` now catches `PIL.UnidentifiedImageError` on a corrupt or non-image input and prints a clean one-line error instead of leaking a Python traceback.\n- `pick_frames.py` now correctly returns exit code 2 (not 0) when `ffprobe` fails on a non-video input, when the video duration is zero, or when the input path contains shell metacharacters. Pipelines that key off exit codes will work correctly now.\n- `pick_frames.py` no longer silently produces zero frames on a very short clip (`< 2 * interval`). It now falls back to 3 evenly-spaced samples for short clips, and the new `--relax-on-empty` flag retries once with very loose thresholds when even the loose default produces no candidates.\n- Removed a redundant double-ffprobe call in `probe_duration`.\n\n**No breaking changes**: existing CLI flags, output filenames, scoring formulas, and verdict thresholds are unchanged. v0.1.0 scripts and pipelines continue to work.\n\n## License\n\nMIT. See `LICENSE`.\n\nFile v0.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn7fkwsa5knkdkkachj1p7rwr9843xts\",\n  \"slug\": \"openclaw-thumbnail-forge\",\n  \"version\": \"0.2.0\",\n  \"publishedAt\": 1778319005731\n}\n\nArchive v0.1.0: 7 files, 14919 bytes\n\nFiles: scripts/check_deps.sh (1089b), scripts/compose_thumbnail.py (13496b), scripts/export_sizes.py (3939b), scripts/make_variants.py (4126b), scripts/pick_frames.py (9727b), SKILL.md (6412b), _meta.json (143b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: openclaw-thumbnail-forge\ndescription: Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, then composes professional thumbnails with text overlays, gradient bars, and watermarks. Exports at YouTube, Shorts, Instagram, X, and LinkedIn sizes. Pure ffmpeg + Pillow, no AI APIs, no remote calls.\nlicense: MIT\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"ffmpeg\",\"ffprobe\",\"python3\"]},\"primaryEnv\":null,\"homepage\":\"https://clawhub.ai/gopendrasharma89-tech/openclaw-thumbnail-forge\"}}\n---\n\n# openclaw-thumbnail-forge\n\nv0.1.0\n\nA practical thumbnail generator for videos. Builds the kind of professional-looking thumbnails creators normally make in Photoshop or Canva, but as a local CLI workflow with no API keys, no online services, and no AI dependencies.\n\n## What this skill does\n\n- `scripts/check_deps.sh` — verify `ffmpeg`, `ffprobe`, `python3` (and the `Pillow` Python package) are installed.\n- `scripts/pick_frames.py` — extract candidate frames from a video and rank them by a composite score combining sharpness (Laplacian variance), brightness, contrast, and ffmpeg scene-change scores. Outputs the top-N frames as PNG files plus a JSON report.\n- `scripts/compose_thumbnail.py` — turn one source frame into a finished thumbnail with bold title text, subtitle, gradient bar, optional logo overlay, and auto contrast boost. Supports custom fonts and color schemes.\n- `scripts/export_sizes.py` — re-export a finished thumbnail to all common platform sizes in one command (YouTube, Shorts, Instagram square, X/Twitter, LinkedIn).\n- `scripts/make_variants.py` — generate four A/B-testable variants of the same thumbnail (different color schemes, text placements, contrast levels) for split-testing.\n\n## What this skill does not do\n\nTo set expectations honestly:\n\n- It does not use AI subject detection or face recognition. Frame ranking is statistical, not semantic.\n- It does not download fonts, stock photos, or any remote asset. You provide your own font path or use the system default.\n- It does not perform OCR, transcription, or generative editing.\n- It does not write outside the directory you provide.\n\n## Required dependencies\n\n```bash\nbash scripts/check_deps.sh\n```\n\nVerifies `ffmpeg`, `ffprobe`, `python3`, and that `PIL` (Pillow) is importable. Pillow is the only Python dependency:\n\n```bash\npip install Pillow\n```\n\n## Workflows\n\n### 1. Pick the best candidate frames from a video\n\n```bash\npython3 scripts/pick_frames.py input.mp4 ./frames/ \\\n  --top 10 --interval 2.0\n```\n\nExtracts a frame every 2 seconds, scores each one, and writes the top 10 as `frames/frame_001.png` through `frames/frame_010.png` plus a `frames/report.json` with per-frame scores.\n\nTunable flags:\n- `--interval <seconds>` — sampling interval (default 2.0)\n- `--top <N>` — how many top frames to keep (default 10)\n- `--min-brightness <0-255>` and `--max-brightness <0-255>` — reject frames that are too dark or blown out\n- `--min-sharpness <float>` — reject blurry frames (Laplacian variance floor)\n\n### 2. Compose a finished thumbnail from a frame\n\n```bash\npython3 scripts/compose_thumbnail.py frames/frame_003.png thumb.png \\\n  --title \"10 ffmpeg Tricks I Wish I Knew Sooner\" \\\n  --subtitle \"A practical tour\" \\\n  --color-scheme bold-yellow \\\n  --position bottom\n```\n\nColor schemes shipped: `bold-yellow`, `clean-white`, `red-alert`, `cool-blue`, `tech-green`. Each scheme defines title color, outline color, shadow, and gradient bar opacity.\n\nPosition options: `top`, `bottom`, `center`. The script auto-fits the title size to the available width and adds a readable gradient bar behind the text so the thumbnail reads at small sizes too.\n\nOptional logo overlay:\n\n```bash\npython3 scripts/compose_thumbnail.py frames/frame_003.png thumb.png \\\n  --title \"Your Title\" \\\n  --logo logo.png --logo-corner top-right --logo-scale 0.12\n```\n\n### 3. Export to all platform sizes at once\n\n```bash\npython3 scripts/export_sizes.py thumb.png ./out/\n```\n\nWrites:\n- `out/youtube_1280x720.png`\n- `out/shorts_1080x1920.png`\n- `out/instagram_1080x1080.png`\n- `out/x_1200x675.png`\n- `out/linkedin_1200x627.png`\n\nEach platform uses smart resize: source is fitted into the target with smart-cropped letterboxing so the title area stays visible.\n\n### 4. Generate A/B variants\n\n```bash\npython3 scripts/make_variants.py frames/frame_003.png ./variants/ \\\n  --title \"10 ffmpeg Tricks\" \\\n  --subtitle \"A practical tour\"\n```\n\nWrites 4 variants:\n- `variant_a_bold_yellow_bottom.png`\n- `variant_b_clean_white_top.png`\n- `variant_c_red_alert_center.png`\n- `variant_d_cool_blue_bottom.png`\n\nSame source frame, different color and layout choices, ideal for click-rate split testing.\n\n## Full pipeline example\n\n```bash\n# 1) Find the best candidate frames\npython3 scripts/pick_frames.py my_video.mp4 ./frames/ --top 5 --interval 1.5\n\n# 2) Compose a thumbnail from the highest-scored frame\npython3 scripts/compose_thumbnail.py frames/frame_001.png thumb.png \\\n  --title \"Your Title Here\" --subtitle \"Optional subtitle\" \\\n  --color-scheme bold-yellow --position bottom\n\n# 3) Export at every platform size\npython3 scripts/export_sizes.py thumb.png ./out/\n\n# 4) Optional: split-test variants\npython3 scripts/make_variants.py frames/frame_001.png ./variants/ \\\n  --title \"Your Title Here\"\n```\n\n## Safety properties\n\n- All Python helpers use `subprocess.run` with argument lists (never `shell=True`) and reject input/output paths containing shell metacharacters via a strict regex allowlist.\n- The skill never reads or writes outside the input/output paths the user provides.\n- No environment variables are read for credentials. No tokens, secrets, or API keys are required.\n- No remote calls of any kind. The skill only invokes locally installed `ffmpeg` and the Python `Pillow` library.\n\n## Known limitations\n\n- Frame scoring is heuristic, not AI-based. It is not aware of \"is the subject's face visible\" — it just maximises sharpness, healthy brightness, and scene-change importance.\n- Default font is the system default if `--font` is not provided. If no usable font is found, the script falls back to Pillow's bitmap font, which looks plain. Pass `--font` for nice typography.\n- `compose_thumbnail.py` does not do automatic background removal. If you want isolated subjects, do the subject-cutout step in a different tool first.\n\n## License\n\nMIT. See `LICENSE`.\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7fkwsa5knkdkkachj1p7rwr9843xts\",\n  \"slug\": \"openclaw-thumbnail-forge\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1777704936117\n}","readmeExcerpt":"Skill: Openclaw Thumbnail Forge Owner: gopendrasharma89-tech Summary: Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails... Tags: ab-testing:0.3.0, auto-pick:0.3.0, branding:0.3.0, creator:0.3.0, ffmpeg:0.3.0, latest:0.3.0, pillow:0.3.0, shorts:0.3.0, thumbnail:0.3.0, video:0.3.0, youtube:0.3.0 Version history: v","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"bash scripts/check_deps.sh"},{"language":"bash","snippet":"pip install Pillow"},{"language":"bash","snippet":"python3 scripts/pick_frames.py input.mp4 ./frames/ \\\n  --top 10 --interval 2.0"},{"language":"bash","snippet":"python3 scripts/compose_thumbnail.py frames/frame_003.png thumb.png \\\n  --title \"10 ffmpeg Tricks I Wish I Knew Sooner\" \\\n  --subtitle \"A practical tour\" \\\n  --color-scheme bold-yellow \\\n  --position bottom"},{"language":"bash","snippet":"python3 scripts/compose_thumbnail.py frames/frame_003.png thumb.png \\\n  --title \"Your Title\" \\\n  --logo logo.png --logo-corner top-right --logo-scale 0.12"},{"language":"bash","snippet":"python3 scripts/export_sizes.py thumb.png ./out/"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: openclaw-thumbnail-forge\ndescription: Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails with text overlays, gradient bars, and watermarks, and ranks A/B variants on objective click-likelihood metrics. Exports at YouTube, Shorts, Instagram, X, and LinkedIn sizes. Pure ffmpeg + Pillow, no AI APIs, no remote calls.\nlicense: MIT\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"ffmpeg\",\"ffprobe\",\"python3\"]},\"primaryEnv\":null,\"homepage\":\"https://clawhub.ai/gopendrasharma89-tech/openclaw-thumbnail-forge\"}}\n---\n\n# openclaw-thumbnail-forge\n\nv0.3.0\n\nA practical thumbnail generator for videos. Builds the kind of professional-looking thumbnails creators normally make in Photoshop or Canva, but as a local CLI workflow with no API keys, no online services, and no AI dependencies.\n\n## What this skill does\n\n- `scripts/check_deps.sh` — verify `ffmpeg`, `ffprobe`, `python3` (and the `Pillow` Python package) are installed.\n- `scripts/pick_frames.py` — extract candidate frames from a video and rank them by a composite score combining sharpness, brightness, contrast, and ffmpeg scene-change scores. Outputs the top-N frames as PNG files plus a JSON report.\n- `scripts/compose_thumbnail.py` — turn one source frame into a finished thumbnail with bold title text, subtitle, gradient bar, optional logo overlay, and auto contrast boost. Supports custom fonts and color schemes.\n- `scripts/export_sizes.py` — re-export a finished thumbnail to all common platform sizes in one command (YouTube, Shorts, Instagram square, X/Twitter, LinkedIn).\n- `scripts/make_variants.py` — generate four A/B-testable variants of the same thumbnail (different color schemes, text placements, contrast levels) for split-testing. NEW in v0.3.0: pass `--auto-pick` to immediately score the four variants with `score_thumbnail.py`, copy the winner to `<output_dir>/winner.png`, and write a `winner.json` with the full ranking. One command, one decision.\n- `scripts/score_thumbnail.py` (NEW in v0.2.0) — score one or more finished thumbnails on six objective visual metrics and pick the most likely click-winner. Gives a numeric click-likelihood score (0-100) per thumbnail and an explanation of which metrics drove the result.\n\n## What this skill does not do\n\nTo set expectations honestly:\n\n- It does not use AI subject detection or face recognition. Frame ranking and click-likelihood scoring are statistical, not semantic.\n- It does not download fonts, stock photos, or any remote asset. You provide your own font path or use the system default.\n- It does not perform OCR, transcription, or generative editing.\n- It does not write outside the directory you provide.\n- The click-likelihood scorer is a deterministic heuristic, not a real ML CTR model. It captures widely-cited thumbnail design rules (punch, focal pop, color punch, text band, brightness, edge density). Treat its output as a tie-breaker, not a guaran"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7fkwsa5knkdkkachj1p7rwr9843xts\",\n  \"slug\": \"openclaw-thumbnail-forge\",\n  \"version\": \"0.3.0\",\n  \"publishedAt\": 1779104965966\n}"},{"path":"skill-card.md","content":"## Description:\n\nLocal thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails with text overlays, gradient bars, and watermarks, and ranks A/B variants on objective click-likelihood metrics.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[gopendrasharma89-tech](https://clawhub.ai/user/gopendrasharma89-tech)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nCreators, marketers, and developers use this skill to turn local video frames into platform-ready thumbnails, generate A/B variants, and choose a heuristic winner without remote services or AI APIs.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The workflow invokes local media tools and writes generated PNG or JSON files to output paths.\n\nMitigation: Run scripts as a normal user, keep PATH limited to trusted directories, and choose output directories where overwriting generated files is acceptable.\n\nRisk: Pillow is required for image processing.\n\nMitigation: Install Pillow in a virtual environment from a trusted package index.\n\nRisk: Frame and click-likelihood scores are deterministic heuristics, not semantic review or real CTR prediction.\n\nMitigation: Treat rankings as a tie-breaker and review selected thumbnails before publication.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/gopendrasharma89-tech/skills/openclaw-thumbnail-forge)\n- [OpenClaw homepage](https://clawhub.ai/gopendrasharma89-tech/openclaw-thumbnail-forge)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, shell commands, code, configuration, text]\n\n**Output Format:** [Markdown guidance with CLI commands and generated PNG or JSON file outputs]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces local image assets, frame reports, variant rankings, and winner metadata in user-specified output directories.]\n\n## Skill Version(s):\n\n0.3.0 (source: server release metadata and SKILL.md)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"LICENSE","content":"MIT License\n\nCopyright (c) 2026 gopendrasharma89-tech\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails... Skill: Openclaw Thumbnail Forge Owner: gopendrasharma89-tech Summary: Local thumbnail generator for videos. Picks the best candidate frames using brightness, sharpness, and scene-change scores, composes professional thumbnails... Tags: ab-testing:0.3.0, auto-pick:0.3.0, branding:0.3.0, creator:0.3.0, ffmpeg:0.3.0, latest:0.3.0, pillow:0.3.0, shorts:0.3.0, thumbnail:0.3.0, video:0.3.0, youtube:0.3.0 Version history: v","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1764,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T16:27:24.844Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T16:27:24.844Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:57:38.160Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}