Not in the top 1,000 by GitHub stars
xiejunjie524/handdraw-story-video
Turn hand-drawn story illustrations into 35–45 second line-reveal and gradual-coloring videos with HyperFrames.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
13bd9dc3cf77 → 13bd9dc3cf77
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 13bd9dc3cf77
No earlier version was observed for comparison.
Heat
3.6- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
How it works
handdraw-good-deed-story
When your agent uses it
Batch-produce 35–45 second vertical hand-drawn good-deed story videos with black line art revealed left to right and aligned low-saturation color filling in the same direction. Use for Chinese warm-story shorts, gradual line-art coloring videos, reusable eight-beat story templates, or HyperFrames delivery of this visual format.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
664 tokensWhen the skill is activated
Reference documents
5,527 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Defaults
- Workflow
- Visual constraints
Scripts executed separately
scripts/build_story.pyscripts/make_lineart.pyscripts/one_click.pytests/test_one_click_atlascloud.py
Files
.gitignoreasset422 bytesLICENSEasset1,090 bytesREADME.mddoc3,907 bytesSKILL.mdcore2,933 bytesagents/openai.yamlasset239 bytesassets/audio/.gitkeepasset1 bytesassets/images/.gitkeepasset1 bytesconfig.atlascloud.example.jsonasset546 bytesconfig.example.jsonasset500 bytesdocs/image-generation.mddoc3,899 bytesdocs/prompts.mddoc4,636 bytesdocs/story-spec.mddoc2,066 bytesdocs/usage.mddoc4,429 bytesexamples/soy-milk-at-4am/README.mddoc570 bytesexamples/soy-milk-at-4am/assets/images/scene-01-color.pngasset863,105 bytesexamples/soy-milk-at-4am/assets/images/scene-01-line.pngasset441,010 bytesexamples/soy-milk-at-4am/preview.jpgasset47,185 bytesexamples/soy-milk-at-4am/story.jsonasset2,154 bytesrequirements.txtdoc46 bytesscripts/build_story.pyruns12,183 bytesscripts/make_lineart.pyruns2,406 bytesscripts/one_click.pyruns17,343 bytestemplates/story-template.jsonasset1,896 bytestemplates/style-prompt.txtdoc1,222 bytestests/test_one_click_atlascloud.pyruns5,066 bytes
Read SKILL.md
# Hand-drawn good-deed story
Create a compact cause-and-effect story, then build it with the bundled scripts and HyperFrames.
## Defaults
- Deliver 40 seconds, 720×960, 30 fps, H.264 MP4.
- Use 8 distinct beats of about 5 seconds; accept 7–9 beats and 35–45 seconds.
- Use no narration by default. Select licensed BGM for each story instead of fixing one track.
- Generate one 1K low-saturation color mother image per beat. Never retry image generation automatically.
- Derive line art locally from the exact color image with `scripts/make_lineart.py`; never generate line and color images separately.
- Reveal line art left to right, then fill color left to right from the same origin.
- Render with one worker and never overwrite a prior render.
View the complete source on GitHubSkills included
- handdraw-good-deed-story
Repository facts
- License
- MIT
- Created
- Jul 18, 2026
- Last pushed
- Jul 23, 2026
- Forks
- 110
- Open issues
- 0
- Project activity
- Slowing
Rank over the last 12 weeks
Now #982 · best #669 · down 226 in 30 days
- #823 on Oct 17
- #808 on Oct 18
- #850 on Oct 19
- #866 on Oct 23
- #822 on Oct 24
- #982 since Oct 25
44 earlier periods
- #788 on Aug 1
- #669 on Aug 7
- #680 on Aug 9
- #702 on Aug 10
- #712 on Aug 11
- #704 on Aug 12
- #703 on Aug 13
- #700 on Aug 14
- #699 on Aug 16
- #723 on Aug 18
- #711 on Aug 19
- #707 on Aug 20
- #711 on Aug 21
- #677 on Aug 22
- #709 on Aug 23
- #742 on Aug 27
- #764 on Aug 28
- #749 on Aug 31
- #762 on Sep 1
- #732 on Sep 4
- #716 on Sep 5
- #759 on Sep 7
- #766 on Sep 9
- #782 on Sep 10
- #754 on Sep 11
- #749 from Sep 12 to Sep 13
- #776 on Sep 14
- #767 on Sep 15
- #774 on Sep 16
- #778 on Sep 17
- #741 on Sep 19
- #751 on Sep 20
- #777 on Sep 21
- #756 on Sep 24
- #757 on Oct 3
- #787 on Oct 4
- #800 on Oct 5
- #863 on Oct 8
- #826 on Oct 9
- #810 on Oct 10
- #807 on Oct 11
- #828 on Oct 12
- #852 on Oct 14
- #847 on Oct 16
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 4, 2026
- No broad tool permissions
- No dangerous shell commands
- 49 network referencesin 6 files: scripts/one_click.py:18 tests/test_one_click_atlascloud.py:35 README.md:23 and 3 more
- 1 obfuscation signalin 1 file: scripts/one_click.py:195
- No instruction overrides
- 4 executable scriptsin 4 files: scripts/build_story.py:1 scripts/make_lineart.py:1 scripts/one_click.py:1 and 1 more
- 24 references to secretsin 7 files: tests/test_one_click_atlascloud.py:36 scripts/one_click.py:22 config.atlascloud.example.json:4 and 4 more
- No requests to vote in Hot
Show all 78 signals by file
.gitignore
- Access to secretsline 27
[Credential-related source omitted]
README.md
- Network accessline 23
- Node.js 18+ - FFmpeg - [HyperFrames](https://www.npmjs.com/package/hyperframes) - Network accessline 24
- FFmpeg - [HyperFrames](https://www.npmjs.com/package/hyperframes) - GSAP 3(通过 npm 安装,遵守其许可条款) - Network accessline 25
- [HyperFrames](https://www.npmjs.com/package/hyperframes) - Network accessline 31
git clone https://github.com/xiejunjie524/handdraw-story-video.git
config.atlascloud.example.json
config.example.json
- Network accessline 2
"image": { "provider": "", "base_url": "https://your-image-provider.example/v1", - Network accessline 3
"provider": "", "base_url": "https://your-image-provider.example/v1", "api_key_env": "IMAGE_API_KEY", - Network accessline 4
"base_url": "https://your-image-provider.example/v1", - Access to secretsline 5
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted]
docs/image-generation.md
- Network accessline 10
IMAGE_PROVIDER=your-provider IMAGE_API_BASE_URL=https://your-provider.example/v1 - Network accessline 11
IMAGE_API_BASE_URL=https://your-provider.example/v1 - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted]
docs/usage.md
scripts/build_story.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/make_lineart.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/one_click.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 18
ATLASCLOUD_MEDIA_BASE_URL = "https://api.atlascloud.ai/api/v1" - Network accessline 19
ATLASCLOUD_LLM_BASE_URL = "https://api.atlascloud.ai/v1" - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 150
[Credential-related source omitted] - Network accessline 158
f"固定画风要求:{style_prompt}" ) response = requests.post( - Network accessline 159
) response = requests.post( endpoint(base_url, "/chat/completions"), - Network accessline 160
response = requests.post( - Possible obfuscationline 195
output_path.write_bytes(base64.b64decode(str(item["b64_json"]))) - Network accessline 197
url = item.get("url") or item.get("download_url") if url: image_response = requests.get(str(url), timeout=300) - Network accessline 198
if url: image_response = requests.get(str(url), timeout=300) image_response.raise_for_status() - Network accessline 199
image_response = requests.get(str(url), timeout=300) - Network accessline 223
fail(f"reference image not found: {path}") with path.open("rb") as handle: response = requests.post( - Network accessline 224
with path.open("rb") as handle: response = requests.post( endpoint(base_url, "/model/uploadMedia"), - Network accessline 225
response = requests.post( - Access to secretsline 241
[Credential-related source omitted] - Network accessline 254
else: payload["image_urls"] = urls response = requests.post( - Network accessline 255
payload["image_urls"] = urls response = requests.post( endpoint(base_url, "/model/generateImage"), - Network accessline 256
response = requests.post( - Network accessline 273
poll_interval = float(image_config.get("poll_interval", 3)) while time.monotonic() < deadline: poll_response = requests.get( - Network accessline 274
while time.monotonic() < deadline: poll_response = requests.get( endpoint(base_url, f"/model/prediction/{prediction_id}"), - Network accessline 275
poll_response = requests.get( - Access to secretsline 299
[Credential-related source omitted] - Network accessline 310
files.append(("image", (path.name, path.open("rb"), "image/png"))) try: response = requests.post( - Network accessline 311
try: response = requests.post( endpoint(base_url, "/images/edits"), - Network accessline 312
response = requests.post( - Network accessline 321
handle.close() else: response = requests.post( - Network accessline 322
else: response = requests.post( endpoint(base_url, "/images/generations"), - Network accessline 323
response = requests.post(
tests/test_one_click_atlascloud.py
- Executable scriptline 1
Executable file - Network accessline 35
self.assertEqual(config["base_url"], "https://api.atlascloud.ai/api/v1") - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Network accessline 52
def fake_get(url: str, **kwargs): if url.endswith("/model/prediction/prediction-1"): return FakeResponse({"code": 200, "data": {"status": "completed", "outputs": ["https://cdn.example/story.png"]}}) - Network accessline 53
if url.endswith("/model/prediction/prediction-1"): return FakeResponse({"code": 200, "data": {"status": "completed", "outputs": ["https://cdn.example/story.png"]}}) if url == "https://cdn.example/story.png": - Network accessline 54
return FakeResponse({"code": 200, "data": {"status": "completed", "outputs": ["https://cdn.example/story.png"]}}) - Network accessline 55
if url == "https://cdn.example/story.png": - Access to secretsline 62
[Credential-related source omitted] - Network accessline 67
self.assertEqual(output.read_bytes(), b"png-bytes") self.assertEqual(calls[0][0], "https://api.atlascloud.ai/api/v1/model/generateImage") - Network accessline 68
self.assertEqual(calls[0][0], "https://api.atlascloud.ai/api/v1/model/generateImage") - Network accessline 76
def fake_post(url: str, **kwargs): if url.endswith("/model/uploadMedia"): return FakeResponse({"code": 200, "data": {"download_url": "https://cdn.example/ref.png"}}) - Network accessline 77
if url.endswith("/model/uploadMedia"): return FakeResponse({"code": 200, "data": {"download_url": "https://cdn.example/ref.png"}}) calls.append((url, kwargs.get("json"))) - Network accessline 78
return FakeResponse({"code": 200, "data": {"download_url": "https://cdn.example/ref.png"}}) - Network accessline 82
def fake_get(url: str, **kwargs): if url.endswith("/model/prediction/prediction-2"): return FakeResponse({"code": 200, "data": {"status": "completed", "outputs": ["https://cdn.example/out.png"]}}) - Network accessline 83
if url.endswith("/model/prediction/prediction-2"): return FakeResponse({"code": 200, "data": {"status": "completed", "outputs": ["https://cdn.example/out.png"]}}) if url == "https://cdn.example/out.png": - Network accessline 84
return FakeResponse({"code": 200, "data": {"status": "completed", "outputs": ["https://cdn.example/out.png"]}}) - Network accessline 85
if url == "https://cdn.example/out.png": - Access to secretsline 97
[Credential-related source omitted] - Network accessline 102
self.assertEqual(output.read_bytes(), b"out-bytes") self.assertEqual(calls[0][1]["image_url"], "https://cdn.example/ref.png") - Network accessline 103
self.assertEqual(calls[0][1]["image_url"], "https://cdn.example/ref.png")
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 1 fact
- Network access in code of documentationREADME.md:31Low confidence
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.