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

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 13bd9dc3cf77c0144404d8db79d72a1e5075374e

807GitHub stars
7stars in 7 days
1skill in this repository
0commits in 30 days

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

Jul 31, 2026Nov 5, 2026807

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 tokens

Always available to the agent

SKILL.md

664 tokens

When the skill is activated

Reference documents

5,527 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Defaults
  2. Workflow
  3. Visual constraints

Scripts executed separately

  • scripts/build_story.py
  • scripts/make_lineart.py
  • scripts/one_click.py
  • tests/test_one_click_atlascloud.py

Files

  • .gitignoreasset422 bytes
  • LICENSEasset1,090 bytes
  • README.mddoc3,907 bytes
  • SKILL.mdcore2,933 bytes
  • agents/openai.yamlasset239 bytes
  • assets/audio/.gitkeepasset1 bytes
  • assets/images/.gitkeepasset1 bytes
  • config.atlascloud.example.jsonasset546 bytes
  • config.example.jsonasset500 bytes
  • docs/image-generation.mddoc3,899 bytes
  • docs/prompts.mddoc4,636 bytes
  • docs/story-spec.mddoc2,066 bytes
  • docs/usage.mddoc4,429 bytes
  • examples/soy-milk-at-4am/README.mddoc570 bytes
  • examples/soy-milk-at-4am/assets/images/scene-01-color.pngasset863,105 bytes
  • examples/soy-milk-at-4am/assets/images/scene-01-line.pngasset441,010 bytes
  • examples/soy-milk-at-4am/preview.jpgasset47,185 bytes
  • examples/soy-milk-at-4am/story.jsonasset2,154 bytes
  • requirements.txtdoc46 bytes
  • scripts/build_story.pyruns12,183 bytes
  • scripts/make_lineart.pyruns2,406 bytes
  • scripts/one_click.pyruns17,343 bytes
  • templates/story-template.jsonasset1,896 bytes
  • templates/style-prompt.txtdoc1,222 bytes
  • tests/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 GitHub

Skills 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

  1. #823 on Oct 17
  2. #808 on Oct 18
  3. #850 on Oct 19
  4. #866 on Oct 23
  5. #822 on Oct 24
  6. #982 since Oct 25
44 earlier periods
  1. #788 on Aug 1
  2. #669 on Aug 7
  3. #680 on Aug 9
  4. #702 on Aug 10
  5. #712 on Aug 11
  6. #704 on Aug 12
  7. #703 on Aug 13
  8. #700 on Aug 14
  9. #699 on Aug 16
  10. #723 on Aug 18
  11. #711 on Aug 19
  12. #707 on Aug 20
  13. #711 on Aug 21
  14. #677 on Aug 22
  15. #709 on Aug 23
  16. #742 on Aug 27
  17. #764 on Aug 28
  18. #749 on Aug 31
  19. #762 on Sep 1
  20. #732 on Sep 4
  21. #716 on Sep 5
  22. #759 on Sep 7
  23. #766 on Sep 9
  24. #782 on Sep 10
  25. #754 on Sep 11
  26. #749 from Sep 12 to Sep 13
  27. #776 on Sep 14
  28. #767 on Sep 15
  29. #774 on Sep 16
  30. #778 on Sep 17
  31. #741 on Sep 19
  32. #751 on Sep 20
  33. #777 on Sep 21
  34. #756 on Sep 24
  35. #757 on Oct 3
  36. #787 on Oct 4
  37. #800 on Oct 5
  38. #863 on Oct 8
  39. #826 on Oct 9
  40. #810 on Oct 10
  41. #807 on Oct 11
  42. #828 on Oct 12
  43. #852 on Oct 14
  44. #847 on Oct 16

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 4, 2026

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

  • Access to secretsline 4
    [Credential-related source omitted]
  • Access to secretsline 5
    [Credential-related source omitted]
  • Access to secretsline 14
    [Credential-related source omitted]
  • Access to secretsline 15
    [Credential-related source omitted]

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

  • Network accessline 10
    git clone https://github.com/xiejunjie524/handdraw-story-video.git
  • Access to secretsline 48
    [Credential-related source omitted]

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 compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.