← All skills
data2story
85 / 100 · Low risk
Fine to try. Some of what it can do is expected: a data skill usually connects to databases or online services with your credentials.
By QinghongLin/data2story-skill (GitHub) · data · 161 stars · scanned at commit 63a55c1
Data Journalist Agent (Data2Story) — orchestrator: turn a dataset into a blog. Runs detective → analyst → editor → designer → programmer → auditor → inspector in sequence. Creates a versioned project folder for each run.
Works with any agent that supports SKILL.md skills.
What this skill can do
Runs commands on your computer
The author does not mention this.
Found in 11 places.
Show 8 more
Sends data to these websites: www.youtube.com, open.spotify.com
The author does not mention this. Expected for a data skill.
Found in 38 places.
Show 17 more
- skills/data2story/designer/scripts/openrouter-image2video/scripts/generate_video_from_image.py, line 25
import argparse, base64, json, mimetypes, os, sys, time, urllib.request, urllib.error - skills/data2story/designer/scripts/openrouter-image2video/scripts/generate_video_from_image.py, line 37
r = urllib.request.Request(url, data=data, headers=headers, method=method) - skills/data2story/designer/scripts/openrouter-image2video/scripts/generate_video_from_image.py, line 39
with urllib.request.urlopen(r, timeout=timeout) as resp: - skills/data2story/designer/scripts/openrouter-text2image/scripts/generate_image.py, line 14
import argparse, base64, json, os, sys, urllib.request, urllib.error, re - skills/data2story/designer/scripts/openrouter-text2image/scripts/generate_image.py, line 50
req = urllib.request.Request( - skills/data2story/designer/scripts/openrouter-text2image/scripts/generate_image.py, line 56
with urllib.request.urlopen(req, timeout=120) as r: - skills/data2story/designer/scripts/openrouter-text2music/scripts/generate_music.py, line 14
import argparse, base64, json, os, sys, urllib.request, urllib.error, re - skills/data2story/designer/scripts/openrouter-text2music/scripts/generate_music.py, line 50
req = urllib.request.Request( - skills/data2story/designer/scripts/openrouter-text2music/scripts/generate_music.py, line 63
with urllib.request.urlopen(req, timeout=600) as r: - skills/data2story/designer/scripts/openrouter-text2video/scripts/generate_video.py, line 17
import argparse, json, os, sys, time, urllib.request, urllib.error - skills/data2story/designer/scripts/openrouter-text2video/scripts/generate_video.py, line 29
r = urllib.request.Request(url, data=data, headers=headers, method=method) - skills/data2story/designer/scripts/openrouter-text2video/scripts/generate_video.py, line 31
with urllib.request.urlopen(r, timeout=timeout) as resp: - skills/data2story/detective/references/instance_verification.json, line 8
"detail": "Not from prior knowledge. Use WebFetch against a Spotify search page, an artist/album page, the YouTube watch page, or a credible third-party listing - skills/data2story/detective/references/instance_verification.json, line 15
"youtube_status": "curl -s -o /dev/null -w \"%{http_code}\\n\" \"https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=<ID>&format=json\"", - skills/data2story/detective/references/instance_verification.json, line 16
"youtube_title": "curl -s \"https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=<ID>&format=json\" | python3 -c \"import json,sys;d=json.load(sys - skills/data2story/detective/references/instance_verification.json, line 17
"spotify_status": "curl -s -o /dev/null -w \"%{http_code}\\n\" \"https://open.spotify.com/oembed?url=https://open.spotify.com/track/<ID>\"", - skills/data2story/detective/references/instance_verification.json, line 18
"spotify_title": "curl -s \"https://open.spotify.com/oembed?url=https://open.spotify.com/track/<ID>\" | python3 -c \"import json,sys;d=json.load(sys.stdin);prin
and 18 more places
Can call paid AI services billed to you
This is disclosed by the author in the skill's SKILL.md or README.
Found in 5 places.
Show 2 more
Install
Paste this into your terminal. It downloads exactly the version we scanned, not whatever is newest.
if [ -e ~/.agents/skills/'data2story' ] || [ -L ~/.agents/skills/'data2story' ]; then echo 'A skill folder named data2story already exists — not replacing it' >&2; false; else d=$(mktemp -d) && git clone --quiet --filter=blob:none --no-checkout 'https://github.com/QinghongLin/data2story-skill' "$d" && git -C "$d" checkout --quiet '63a55c15f3fac13239263cfa1361fe2ef04d8df1' -- 'skills/data2story' && mkdir -p ~/.agents/skills && cp -R "$d"/'skills/data2story' ~/.agents/skills/'data2story' && rm -rf "$d"; fi
Codex reads ~/.agents/skills directly. For Claude Code, Cursor, Copilot, Gemini CLI, Antigravity or OpenCode, also link it. For Claude Code: ln -s ~/.agents/skills/'data2story' ~/.claude/skills/'data2story' (other agents: ~/.cursor/skills, ~/.copilot/skills, ~/.gemini/skills, ~/.gemini/config/skills, ~/.config/opencode/skills). Or install through the finder skill, which does both.
Badge for your README
The badge for QinghongLin/data2story-skill shows the score of its lowest-scoring skill.

[](https://zalavijaysinh.github.io/skilltrust/repos/QinghongLin/data2story-skill/)
Score history
| Date | Version | Score |
|---|
| 2026-11-07 | 63a55c1 | 85 |