#382 by GitHub stars

ningzimu/image-to-editable-ppt-skill

Rebuild slide images, scanned or image-based PPT/PPTX files, and PDF decks into object-level editable PowerPoint (.pptx), preserving speaker notes when supplied. Use for making visual slides editable or reconstructing slides from screenshots; not for authoring new presentations from scratch.

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

skills/image-to-editable-ppt/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

b7be494e31a0 → b7be494e31a0

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → b7be494e31a0

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit b7be494e31a0ed56ef98716891db5474606b8cdf

git clone --filter=blob:none --no-checkout https://github.com/ningzimu/image-to-editable-ppt-skill.git .hotskills/ningzimu-image-to-editable-ppt-skill && git -C .hotskills/ningzimu-image-to-editable-ppt-skill checkout --detach b7be494e31a0ed56ef98716891db5474606b8cdf # Copy each selected skill directory from .hotskills/ningzimu-image-to-editable-ppt-skill into .agents/skills/<skill-name>/
3.3kGitHub stars
61stars in 7 days
1skill in this repository
0commits in 30 days

Heat

5.8
  • Star growth, last 7 daysAhead of 91% of tracked repositories
  • Star growth, last 24 hoursAhead of 71% of tracked repositories
  • Rank movement, last 7 daysAhead of 56% of tracked repositories
  • Commits, last 30 daysAhead of 0% of tracked repositories
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekAhead of 0% of tracked repositories

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Aug 2, 2026Nov 7, 20263,260

Individual skills in this repository

How it works

image-to-editable-ppt

When your agent uses it

Rebuild slide images, scanned or image-based PPT/PPTX files, and PDF decks into object-level editable PowerPoint (.pptx), preserving speaker notes when supplied. Use for making visual slides editable or reconstructing slides from screenshots; not for authoring new presentations from scratch.

What it loads into context

Frontmatter

67 tokens

Always available to the agent

SKILL.md

3,584 tokens

When the skill is activated

Reference documents

15,324 tokens

Loaded on request

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

The playbook

  1. Overview
  2. References
  3. Entry Contract
  4. Roles
  5. Workflow
  6. State Principles
  7. Delivery Principles
  8. Updating This Skill

Scripts executed separately

  • cli/editppt/__init__.py
  • cli/editppt/cli.py
  • cli/editppt/runtime/__init__.py
  • cli/editppt/runtime/_input_normalization.py
  • cli/editppt/runtime/_page_artifacts.py
  • cli/editppt/runtime/build_pptx_from_manifest.py
  • cli/editppt/runtime/configure_image_backend.py
  • cli/editppt/runtime/deck_run_state.py
  • cli/editppt/runtime/deck_text_hints.py
  • cli/editppt/runtime/finalize_deck_run.py
  • cli/editppt/runtime/formula_renderer.py
  • cli/editppt/runtime/image_gen.py
  • cli/editppt/runtime/main.py
  • cli/editppt/runtime/make_page_contact_sheet.py
  • cli/editppt/runtime/native_tables.py
  • cli/editppt/runtime/paddle_text_hints.py
  • cli/editppt/runtime/page_job_status.py
  • cli/editppt/runtime/page_text_metrics.py
  • cli/editppt/runtime/path_geometry.py
  • cli/editppt/runtime/prepare_deck_run.py
  • cli/editppt/runtime/process_asset_sheet.py
  • cli/editppt/runtime/record_imagegen_result.py
  • cli/editppt/runtime/record_page_dispatch.py
  • cli/editppt/runtime/record_page_result.py
  • cli/editppt/runtime/remove_chroma_key.py
  • cli/editppt/runtime/reset_page_job.py
  • cli/editppt/runtime/runtime_env.py
  • cli/editppt/runtime/split_alpha_components.py
  • cli/editppt/runtime/text_hints.py
  • cli/editppt/runtime/validate_pptx.py
  • scripts/build-page-worker-prompt.py

Files

  • SKILL.mdcore17,041 bytes
  • SKILL.mdcore17,041 bytes
  • SKILL.mdcore17,041 bytes
  • SKILL.mdcore17,041 bytes
  • SKILL.mdcore17,041 bytes
  • SKILL.mdcore17,041 bytes
  • SKILL.mdcore17,041 bytes
  • SKILL.mdcore17,041 bytes
  • SKILL.mdcore17,041 bytes
  • SKILL.mdcore17,041 bytes
  • agents/openai.yamlasset261 bytes
  • cli/editppt/__init__.pyruns23 bytes
  • cli/editppt/cli.pyruns706 bytes
  • cli/editppt/runtime/__init__.pyruns67 bytes
  • cli/editppt/runtime/_input_normalization.pyruns14,874 bytes
  • cli/editppt/runtime/_page_artifacts.pyruns4,363 bytes
  • cli/editppt/runtime/build_pptx_from_manifest.pyruns52,473 bytes
  • cli/editppt/runtime/configure_image_backend.pyruns4,886 bytes
  • cli/editppt/runtime/deck_run_state.pyruns5,794 bytes
  • cli/editppt/runtime/deck_text_hints.pyruns7,724 bytes
  • cli/editppt/runtime/finalize_deck_run.pyruns3,762 bytes
  • cli/editppt/runtime/formula_renderer.pyruns8,691 bytes
  • cli/editppt/runtime/image_gen.pyruns30,134 bytes
  • cli/editppt/runtime/main.pyruns37,914 bytes
  • cli/editppt/runtime/make_page_contact_sheet.pyruns881 bytes
  • cli/editppt/runtime/native_tables.pyruns8,379 bytes
  • cli/editppt/runtime/paddle_text_hints.pyruns9,732 bytes
  • cli/editppt/runtime/page_job_status.pyruns2,147 bytes
  • cli/editppt/runtime/page_text_metrics.pyruns11,865 bytes
  • cli/editppt/runtime/path_geometry.pyruns7,999 bytes
  • cli/editppt/runtime/prepare_deck_run.pyruns7,213 bytes
  • cli/editppt/runtime/process_asset_sheet.pyruns5,843 bytes
  • cli/editppt/runtime/record_imagegen_result.pyruns5,910 bytes
  • cli/editppt/runtime/record_page_dispatch.pyruns2,862 bytes
  • cli/editppt/runtime/record_page_result.pyruns5,014 bytes
  • cli/editppt/runtime/remove_chroma_key.pyruns13,894 bytes
  • cli/editppt/runtime/reset_page_job.pyruns2,636 bytes
  • cli/editppt/runtime/runtime_env.pyruns13,484 bytes
  • cli/editppt/runtime/split_alpha_components.pyruns13,577 bytes
  • cli/editppt/runtime/text_hints.pyruns13,963 bytes
  • cli/editppt/runtime/validate_pptx.pyruns35,674 bytes
  • cli/pyproject.tomlasset561 bytes
  • prompts/page-worker.mddoc5,106 bytes
  • references/cli-helper.mddoc16,267 bytes
  • references/manifest-schema.mddoc22,633 bytes
  • references/page-decision-tree.mddoc25,462 bytes
  • scripts/build-page-worker-prompt.pyruns4,594 bytes
Read SKILL.md
# Image to Editable PPT

## Overview

Use the `editppt` runtime to decompose, reconstruct, validate, and assemble visual slides as editable `.pptx`. Inputs may be single or multiple images, PDF, or image-based PPT/PPTX.

## References

Each rule in this skill has exactly one authoritative home; the other files point to it instead of restating it.

- `prompts/page-worker.md`: execution template for page workers — ownership boundary, execution order, required outputs, and return format. The parent agent uses it when generating page-worker prompts.
- `scripts/build-page-worker-prompt.py`: skill-local prompt builder. It reads `prompts/page-worker.md`, fills run/page paths, writes `worker-prompt.md`, and prints the dispatch command template.
- `references/cli-helper.md`: CLI install check (Pre-Run Check), command tree, and command syntax examples. Read it when deciding which `editppt` command to call.
- `references/manifest-schema.md`: the single home for JSON field contracts of deck/page/image artifacts — required manifest fields, positioned-object coordinates, `validation.json`, and `page_result.json` shapes. Read it when writing or validating any run/page file.
- `references/page-decision-tree.md`: the single source of truth for page object decisions — background handling, foreground asset separation, native shapes, formulas, text-hints usage, the final self-check, and the fix-versus-warning split. Read its common decision boundaries first, then the sections relevant to the page inventory; the page prompt provides the reading route.
View the complete source on GitHub

Skills included

  • image-to-editable-ppt

Repository facts

License
MIT
Created
May 21, 2026
Last pushed
Sep 16, 2026
Forks
175
Open issues
1
Project activity
Active

Rank over the last 12 weeks

Now #382 · best #352 · down 19 in 30 days

  1. #373 on Nov 1
  2. #374 on Nov 2
  3. #375 on Nov 3
  4. #376 from Nov 4 to Nov 5
  5. #380 on Nov 6
  6. #382 since Nov 7
74 earlier periods
  1. #386 on Aug 2
  2. #375 on Aug 8
  3. #373 on Aug 9
  4. #384 on Aug 10
  5. #382 on Aug 11
  6. #378 on Aug 12
  7. #379 on Aug 13
  8. #378 on Aug 14
  9. #376 on Aug 15
  10. #382 on Aug 16
  11. #378 on Aug 17
  12. #385 on Aug 18
  13. #381 on Aug 19
  14. #380 on Aug 20
  15. #379 on Aug 21
  16. #375 on Aug 22
  17. #380 from Aug 23 to Aug 25
  18. #378 on Aug 26
  19. #382 on Aug 27
  20. #381 on Aug 28
  21. #373 on Aug 29
  22. #368 on Aug 30
  23. #375 on Aug 31
  24. #382 on Sep 1
  25. #375 on Sep 2
  26. #377 on Sep 3
  27. #368 on Sep 4
  28. #372 on Sep 5
  29. #366 on Sep 6
  30. #374 on Sep 7
  31. #371 on Sep 8
  32. #372 on Sep 9
  33. #371 on Sep 10
  34. #365 on Sep 11
  35. #369 on Sep 12
  36. #368 on Sep 13
  37. #370 on Sep 14
  38. #369 from Sep 15 to Sep 16
  39. #366 on Sep 17
  40. #368 on Sep 18
  41. #361 on Sep 19
  42. #365 on Sep 20
  43. #362 on Sep 21
  44. #366 on Sep 22
  45. #358 on Sep 23
  46. #357 from Sep 24 to Sep 25
  47. #352 on Sep 26
  48. #356 on Sep 27
  49. #358 on Sep 28
  50. #368 on Sep 29
  51. #364 from Sep 30 to Oct 2
  52. #357 on Oct 3
  53. #355 on Oct 4
  54. #360 from Oct 5 to Oct 6
  55. #363 from Oct 7 to Oct 8
  56. #369 on Oct 9
  57. #360 on Oct 10
  58. #363 on Oct 11
  59. #367 from Oct 12 to Oct 14
  60. #364 on Oct 15
  61. #367 on Oct 16
  62. #358 on Oct 17
  63. #364 on Oct 18
  64. #365 on Oct 19
  65. #366 on Oct 20
  66. #367 on Oct 21
  67. #365 on Oct 22
  68. #366 on Oct 23
  69. #360 on Oct 24
  70. #371 on Oct 25
  71. #377 on Oct 28
  72. #376 on Oct 29
  73. #378 on Oct 30
  74. #376 on Oct 31

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 2, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 9 notes
  • skills/image-to-editable-ppt/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/image-to-editable-ppt/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/image-to-editable-ppt/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/image-to-editable-ppt/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/image-to-editable-ppt/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/image-to-editable-ppt/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/image-to-editable-ppt/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/image-to-editable-ppt/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/image-to-editable-ppt/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 172 signals by file

skills/image-to-editable-ppt/SKILL.md

  • Network accessline 66
    Prepare also writes per-page text hints. Whenever `editppt doctor` or prepare reports that no PaddleOCR token is configured (offline fallback), ask the user once before dispatching any page: a free token from https://aistudio.baidu.com/acco

skills/image-to-editable-ppt/cli/editppt/__init__.py

  • Executable scriptline 1
    Executable file

skills/image-to-editable-ppt/cli/editppt/cli.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 18
    [Credential-related source omitted]

skills/image-to-editable-ppt/cli/editppt/runtime/__init__.py

  • Executable scriptline 1
    Executable file

skills/image-to-editable-ppt/cli/editppt/runtime/_input_normalization.py

  • Executable scriptline 1
    Executable file
  • Network accessline 16
    IMG_EXTS = {".png", ".jpg", ".jpeg", ".webp", ".bmp", ".gif", ".tif", ".tiff"} PPT_EXTS = {".ppt", ".pptx"} REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships"
  • Network accessline 17
    PPT_EXTS = {".ppt", ".pptx"} REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships" NS = {
  • Network accessline 18
    REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships"
  • Network accessline 19
    NS = {     "a": "http://schemas.openxmlformats.org/drawingml/2006/main",     "p": "http://schemas.openxmlformats.org/presentationml/2006/main",
  • Network accessline 20
    "a": "http://schemas.openxmlformats.org/drawingml/2006/main",
  • Network accessline 21
    "p": "http://schemas.openxmlformats.org/presentationml/2006/main",
  • Network accessline 22
    "r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships",

skills/image-to-editable-ppt/cli/editppt/runtime/_page_artifacts.py

  • Executable scriptline 1
    Executable file

skills/image-to-editable-ppt/cli/editppt/runtime/build_pptx_from_manifest.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 19
    EMU_PER_INCH = 914400 REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships"
  • Network accessline 20
    REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships"
  • Network accessline 547
    next_id += 1     return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p
  • Network accessline 548
    return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.
  • Network accessline 549
    <p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
  • Network accessline 562
    def rels_xml(manifest, media_start=1, notes_index=None):     rels = ['<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout1.xml"/>']
  • Network accessline 563
    rels = ['<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout1.xml"/>']
  • Network accessline 564
    for i, item in enumerate(manifest.get("images", []), start=1):         target = f"../media/image{media_start + i - 1}{image_ext(item['path'])}"         rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/offi
  • Network accessline 565
    target = f"../media/image{media_start + i - 1}{image_ext(item['path'])}"         rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="{target}"/>')     if notes
  • Network accessline 566
    rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="{target}"/>')
  • Network accessline 567
    if notes_index is not None:         rels.append(             f'<Relationship Id="rId{len(rels) + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" Target="../notesSlides/notesSlide{notes_index}.xml"/>
  • Network accessline 568
    rels.append(             f'<Relationship Id="rId{len(rels) + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" Target="../notesSlides/notesSlide{notes_index}.xml"/>'         )
  • Network accessline 569
    f'<Relationship Id="rId{len(rels) + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" Target="../notesSlides/notesSlide{notes_index}.xml"/>'
  • Network accessline 571
    return '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' + "".join(rels) + "</Relationships>"
  • Network accessline 578
    ) or '<a:p><a:endParaRPr lang="zh-CN" sz="1200"/></a:p>'     return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.
  • Network accessline 579
    return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schema
  • Network accessline 580
    <p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
  • Network accessline 597
    return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Relationships xmlns="{REL_NS}">   <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster" Target="../notesMasters/not
  • Network accessline 598
    <Relationships xmlns="{REL_NS}">   <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster" Target="../notesMasters/notesMaster1.xml"/>   <Relationship Id="rId2" Type="http://schemas.ope
  • Network accessline 599
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster" Target="../notesMasters/notesMaster1.xml"/>
  • Network accessline 600
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="../slides/slide{slide_index}.xml"/>
  • Network accessline 604
    def notes_master_xml():     return """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:notesMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/rela
  • Network accessline 605
    return """<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:notesMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://s
  • Network accessline 606
    <p:notesMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
  • Network accessline 613
    return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Relationships xmlns="{REL_NS}">   <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="../theme/theme1.xml"/>
  • Network accessline 614
    <Relationships xmlns="{REL_NS}">   <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="../theme/theme1.xml"/> </Relationships>"""
  • Network accessline 615
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="../theme/theme1.xml"/>
  • Network accessline 642
    for i in notes_indices:             overrides.append(f'<Override PartName="/ppt/notesSlides/notesSlide{i}.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml"/>')     return f'<?xml version="1.0" en
  • Network accessline 644
    return f'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">{default_xml}{"".join(overrides)}</Types>'
  • Network accessline 657
    size_type = slide_size_type(width, height)     return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/off
  • Network accessline 658
    return f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http:/
  • Network accessline 659
    <p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
  • Network accessline 667
    def presentation_rels_xml(slide_count):     rels = ['<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" Target="slideMasters/slideMaster1.xml"/>']
  • Network accessline 668
    rels = ['<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" Target="slideMasters/slideMaster1.xml"/>']
  • Network accessline 669
    for i in range(1, slide_count + 1):         rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide{i}.xml"/>')     return f'<?xml version="1.0" encod
  • Network accessline 670
    rels.append(f'<Relationship Id="rId{i + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide{i}.xml"/>')
  • Network accessline 674
    def write_common_parts(z, slide_count, width, height, notes_count):     presentation_format = "Widescreen" if is_wide_slide(width, height) else "Custom"     z.writestr("_rels/.rels", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?
  • Network accessline 675
    presentation_format = "Widescreen" if is_wide_slide(width, height) else "Custom"     z.writestr("_rels/.rels", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/re
  • Network accessline 676
    z.writestr("_rels/.rels", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDo
  • Network accessline 677
    z.writestr("docProps/core.xml", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:
  • Network accessline 678
    z.writestr("docProps/app.xml", f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"><Application>Codex</Application><PresentationFormat>{pre
  • Network accessline 679
    z.writestr("ppt/presentation.xml", presentation_xml(slide_count, width, height))     z.writestr("ppt/_rels/presentation.xml.rels", presentation_rels_xml(slide_count))     z.writestr("ppt/slideMasters/slideMaster1.xml", """<?xml version="1.0
  • Network accessline 680
    z.writestr("ppt/_rels/presentation.xml.rels", presentation_rels_xml(slide_count))     z.writestr("ppt/slideMasters/slideMaster1.xml", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><p:sldMaster xmlns:a="http://schemas.openxmlform
  • Network accessline 681
    z.writestr("ppt/slideMasters/slideMaster1.xml", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><p:sldMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument
  • Network accessline 682
    z.writestr("ppt/slideMasters/_rels/slideMaster1.xml.rels", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://sc
  • Network accessline 683
    z.writestr("ppt/slideLayouts/slideLayout1.xml", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument
  • Network accessline 684
    z.writestr("ppt/slideLayouts/_rels/slideLayout1.xml.rels", """<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://sc
  • Network accessline 687
    theme_lines = '<a:ln w="9525"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill></a:ln>' * 3     theme_effects = '<a:effectStyle><a:effectLst/></a:effectStyle>' * 3     z.writestr("ppt/theme/theme1.xml", f"""<?xml version="1.0" encoding=
  • Network accessline 688
    theme_effects = '<a:effectStyle><a:effectLst/></a:effectStyle>' * 3     z.writestr("ppt/theme/theme1.xml", f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?><a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" n
  • Network accessline 689
    z.writestr("ppt/theme/theme1.xml", f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?><a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="ImageToEditablePPT"><a:themeElements><a:clrScheme name="Office"><a:
  • Possible obfuscationline 689
    z.writestr("ppt/theme/theme1.xml", f"""<?xml version="1.0" encoding="UTF-8" standalone="yes"?><a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="ImageToEditablePPT"><a:themeElements><a:clrScheme name="Office"><a:

skills/image-to-editable-ppt/cli/editppt/runtime/configure_image_backend.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 10
    [Credential-related source omitted]
  • Access to secretsline 18
    [Credential-related source omitted]

skills/image-to-editable-ppt/cli/editppt/runtime/deck_run_state.py

  • Executable scriptline 1
    Executable file

skills/image-to-editable-ppt/cli/editppt/runtime/deck_text_hints.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 9
    [Credential-related source omitted]
  • Access to secretsline 39
    [Credential-related source omitted]
  • Network accessline 138
    "cost. ASK THE USER once "             "before reconstructing pages: configure a token now (apply at "             "https://aistudio.baidu.com/account/accessToken, then `editppt config "
  • Network accessline 139
    "before reconstructing pages: configure a token now (apply at "             "https://aistudio.baidu.com/account/accessToken, then `editppt config "             "--paddle-ocr-token <token>` and `editppt run hints <run>` to regenerate this ru
  • Network accessline 140
    "https://aistudio.baidu.com/account/accessToken, then `editppt config "

skills/image-to-editable-ppt/cli/editppt/runtime/finalize_deck_run.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/formula_renderer.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/image_gen.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 45
    DEFAULT_CONFIG_HOME = "~/.editppt" DEFAULT_CODEX_AUTH_FILE = "~/.codex/auth.json" DEFAULT_CODEX_IMAGES_BASE_URL = "https://chatgpt.com/backend-api/codex"
  • Network accessline 46
    DEFAULT_CODEX_AUTH_FILE = "~/.codex/auth.json" DEFAULT_CODEX_IMAGES_BASE_URL = "https://chatgpt.com/backend-api/codex" ENV_FIELDS = ("OPENAI_API_KEY", "OPENAI_BASE_URL", "IMAGE_TO_EDITABLE_PPT_IMAGE_MODEL")
  • Network accessline 47
    DEFAULT_CODEX_IMAGES_BASE_URL = "https://chatgpt.com/backend-api/codex"
  • Access to secretsline 48
    [Credential-related source omitted]
  • Network accessline 49
    MAX_CODEX_RESPONSE_BYTES = 64 * 1024 * 1024 MAX_CODEX_BASE64_CHARS = 64 * 1024 * 1024 CHATGPT_AUTH_CLAIM = "https://api.openai.com/auth"
  • Network accessline 50
    MAX_CODEX_BASE64_CHARS = 64 * 1024 * 1024 CHATGPT_AUTH_CLAIM = "https://api.openai.com/auth" CHATGPT_ACCOUNT_ID_CLAIM = "chatgpt_account_id"
  • Network accessline 51
    CHATGPT_AUTH_CLAIM = "https://api.openai.com/auth"
  • Access to secretsline 57
    [Credential-related source omitted]
  • Network accessline 61
    codex login   editppt config --api-key "your-api-key" --model gpt-image-2.5-sunburst   editppt config --api-key "your-api-key" --base-url https://example.test/v1 --model openai/gpt-image-2.5-sunburst
  • Network accessline 63
    editppt config --api-key "your-api-key" --base-url https://example.test/v1 --model openai/gpt-image-2.5-sunburst
  • Access to secretsline 165
    [Credential-related source omitted]
  • Access to secretsline 228
    [Credential-related source omitted]
  • Access to secretsline 415
    [Credential-related source omitted]
  • Access to secretsline 416
    [Credential-related source omitted]
  • Access to secretsline 419
    [Credential-related source omitted]
  • Access to secretsline 433
    [Credential-related source omitted]
  • Possible obfuscationline 566
    out_path.write_bytes(base64.b64decode(image_b64))
  • Access to secretsline 628
    [Credential-related source omitted]

skills/image-to-editable-ppt/cli/editppt/runtime/main.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 41
    [Credential-related source omitted]
  • Access to secretsline 62
    [Credential-related source omitted]
  • Access to secretsline 63
    [Credential-related source omitted]
  • Access to secretsline 389
    [Credential-related source omitted]
  • Network accessline 465
    epilog="""Examples:   editppt config --api-key "your-api-key" --model gpt-image-2.5-sunburst   editppt config --api-key "your-api-key" --base-url https://example.test/v1 --model openai/gpt-image-2.5-sunburst
  • Network accessline 466
    editppt config --api-key "your-api-key" --model gpt-image-2.5-sunburst   editppt config --api-key "your-api-key" --base-url https://example.test/v1 --model openai/gpt-image-2.5-sunburst   editppt config --clear-base-url
  • Network accessline 467
    editppt config --api-key "your-api-key" --base-url https://example.test/v1 --model openai/gpt-image-2.5-sunburst
  • Network accessline 470
    )     config.add_argument("--api-key", help="OpenAI or OpenAI-compatible API key to store.")     config.add_argument("--base-url", help="OpenAI-compatible base URL, for example https://api.openai.com/v1.")
  • Network accessline 471
    config.add_argument("--api-key", help="OpenAI or OpenAI-compatible API key to store.")     config.add_argument("--base-url", help="OpenAI-compatible base URL, for example https://api.openai.com/v1.")     config.add_argument("--clear-base-ur
  • Network accessline 472
    config.add_argument("--base-url", help="OpenAI-compatible base URL, for example https://api.openai.com/v1.")
  • Network accessline 473
    config.add_argument("--clear-base-url", action="store_true", help="Remove OPENAI_BASE_URL from the config file.")     config.add_argument("--model", help="Default image model for API fallback.")     config.add_argument("--paddle-ocr-token",
  • Network accessline 474
    config.add_argument("--model", help="Default image model for API fallback.")     config.add_argument("--paddle-ocr-token", metavar="TOKEN", help="PaddleOCR-VL token for content-aware text hints. Apply at https://aistudio.baidu.com/account/a
  • Network accessline 475
    config.add_argument("--paddle-ocr-token", metavar="TOKEN", help="PaddleOCR-VL token for content-aware text hints. Apply at https://aistudio.baidu.com/account/accessToken.")
  • Access to secretsline 476
    [Credential-related source omitted]
  • Access to secretsline 753
    [Credential-related source omitted]
  • Network accessline 757
    codex login   editppt config --api-key "your-api-key" --model gpt-image-2.5-sunburst   editppt config --api-key "your-api-key" --base-url https://example.test/v1 --model openai/gpt-image-2.5-sunburst
  • Network accessline 759
    editppt config --api-key "your-api-key" --base-url https://example.test/v1 --model openai/gpt-image-2.5-sunburst

skills/image-to-editable-ppt/cli/editppt/runtime/make_page_contact_sheet.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/native_tables.py

  • Executable scriptline 1
    Executable file
  • Network accessline 138
    rows.append(f'<a:tr h="{emu(table["row_heights"][r])}">{"".join(parts)}</a:tr>')     grid = "".join(f'<a:gridCol w="{emu(width)}"/>' for width in table["column_widths"])     return f'''<p:graphicFrame><p:nvGraphicFramePr><p:cNvPr id="{idx}"
  • Network accessline 140
    return f'''<p:graphicFrame><p:nvGraphicFramePr><p:cNvPr id="{idx}" name="Table {idx}"/><p:cNvGraphicFramePr/><p:nvPr/></p:nvGraphicFramePr><p:xfrm><a:off x="{emu(table['left'])}" y="{emu(table['top'])}"/><a:ext cx="{emu(table['width'])}" cy

skills/image-to-editable-ppt/cli/editppt/runtime/paddle_text_hints.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 31
    JOB_URL = "https://paddleocr.aistudio-app.com/api/v2/ocr/jobs"
  • Network accessline 51
    optional = {"useDocOrientationClassify": False, "useDocUnwarping": False, "useChartRecognition": False}     with file_path.open("rb") as handle:         response = requests.post(
  • Network accessline 52
    with file_path.open("rb") as handle:         response = requests.post(             JOB_URL,
  • Network accessline 53
    response = requests.post(
  • Network accessline 65
    started = time.time()     while True:         status = requests.get(f"{JOB_URL}/{job_id}", headers=headers, timeout=60).json()["data"]
  • Network accessline 66
    while True:         status = requests.get(f"{JOB_URL}/{job_id}", headers=headers, timeout=60).json()["data"]         state = status["state"]
  • Network accessline 67
    status = requests.get(f"{JOB_URL}/{job_id}", headers=headers, timeout=60).json()["data"]
  • Network accessline 77
    jsonl = requests.get(status["resultUrl"]["jsonUrl"], timeout=60)
  • Access to secretsline 180
    [Credential-related source omitted]

skills/image-to-editable-ppt/cli/editppt/runtime/page_job_status.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/page_text_metrics.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/path_geometry.py

  • Executable scriptline 1
    Executable file

skills/image-to-editable-ppt/cli/editppt/runtime/prepare_deck_run.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/process_asset_sheet.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/record_imagegen_result.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/record_page_dispatch.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/record_page_result.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/remove_chroma_key.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/reset_page_job.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/runtime_env.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 14
    DEFAULT_IMAGE_MODEL = "gpt-image-2.5-sunburst" ENV_FIELDS = ("OPENAI_API_KEY", "OPENAI_BASE_URL", "IMAGE_TO_EDITABLE_PPT_IMAGE_MODEL", "PADDLE_OCR_TOKEN") PADDLE_TOKEN_APPLY_URL = "https://aistudio.baidu.com/account/accessToken"
  • Network accessline 15
    [Credential-related source omitted]
  • Access to secretsline 15
    [Credential-related source omitted]
  • Network accessline 16
    PADDLE_TOKEN_APPLY_URL = "https://aistudio.baidu.com/account/accessToken"
  • Access to secretsline 18
    [Credential-related source omitted]
  • Access to secretsline 111
    [Credential-related source omitted]
  • Access to secretsline 115
    [Credential-related source omitted]
  • Access to secretsline 133
    [Credential-related source omitted]
  • Access to secretsline 134
    [Credential-related source omitted]
  • Access to secretsline 158
    [Credential-related source omitted]
  • Access to secretsline 174
    [Credential-related source omitted]
  • Access to secretsline 176
    [Credential-related source omitted]
  • Access to secretsline 183
    [Credential-related source omitted]
  • Access to secretsline 184
    [Credential-related source omitted]
  • Network accessline 197
    [Credential-related source omitted]
  • Network accessline 198
    [Credential-related source omitted]
  • Access to secretsline 198
    [Credential-related source omitted]
  • Network accessline 199
    "OPENAI_BASE_URL": values.get("OPENAI_BASE_URL", "https://api.openai.com/v1"),
  • Access to secretsline 263
    [Credential-related source omitted]
  • Access to secretsline 299
    [Credential-related source omitted]
  • Network accessline 319
    cfg = sub.add_parser("config", help="Write or update ~/.editppt/config.yaml")     cfg.add_argument("--api-key", help="OpenAI or OpenAI-compatible API key to store.")     cfg.add_argument("--base-url", help="OpenAI-compatible base URL, for e
  • Network accessline 320
    cfg.add_argument("--api-key", help="OpenAI or OpenAI-compatible API key to store.")     cfg.add_argument("--base-url", help="OpenAI-compatible base URL, for example https://api.openai.com/v1.")     cfg.add_argument("--clear-base-url", actio
  • Network accessline 321
    cfg.add_argument("--base-url", help="OpenAI-compatible base URL, for example https://api.openai.com/v1.")
  • Access to secretsline 325
    [Credential-related source omitted]

skills/image-to-editable-ppt/cli/editppt/runtime/split_alpha_components.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/text_hints.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/image-to-editable-ppt/cli/editppt/runtime/validate_pptx.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 14
    NS = {     "a": "http://schemas.openxmlformats.org/drawingml/2006/main",
  • Network accessline 15
    "a": "http://schemas.openxmlformats.org/drawingml/2006/main",
  • Network accessline 16
    "p": "http://schemas.openxmlformats.org/presentationml/2006/main",
  • Network accessline 17
    "rel": "http://schemas.openxmlformats.org/package/2006/relationships",

skills/image-to-editable-ppt/scripts/build-page-worker-prompt.py

  • Executable scriptline 1
    #!/usr/bin/env python3

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.

Declared and executed: 10 facts
Signal confidence: 172 facts

and 122 more

Works with

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

Add this badge to your README

It updates every night and links to this page.

ningzimu/image-to-editable-ppt-skill: #382 on hotskills, 3.3k stars

[![ningzimu/image-to-editable-ppt-skill on hotskills](https://hotskills.dev/badge/ningzimu-image-to-editable-ppt-skill.svg)](https://hotskills.dev/skill/ningzimu-image-to-editable-ppt-skill/)