Image To Editable Ppt
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 this skill any time a .pptx file is involved -- as input, output, or both.
$ npx skills add FerroxLabs/wayland --skill officecli-pptx -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install FerroxLabs/wayland officecli-pptx --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .claude/skills && cp -r skills-src/src/process/resources/skills/officecli-pptx .claude/skills/officecli-pptx && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "officecli-pptx" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills/officecli-pptx into .claude/skills/officecli-pptx/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "officecli-pptx", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills/officecli-pptxType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add FerroxLabs/wayland --skill officecli-pptx -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install FerroxLabs/wayland officecli-pptx --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .agents/skills && cp -r skills-src/src/process/resources/skills/officecli-pptx .agents/skills/officecli-pptx && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "officecli-pptx" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills/officecli-pptx into .agents/skills/officecli-pptx/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "officecli-pptx", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FerroxLabs/wayland --skill officecli-pptx -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install FerroxLabs/wayland officecli-pptx --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/src/process/resources/skills/officecli-pptx .cursor/skills/officecli-pptx && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "officecli-pptx" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills/officecli-pptx into .cursor/skills/officecli-pptx/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "officecli-pptx", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/FerroxLabs/wayland.git --path src/process/resources/skills/officecli-pptx--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add FerroxLabs/wayland --skill officecli-pptx -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install FerroxLabs/wayland officecli-pptx --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/src/process/resources/skills/officecli-pptx .gemini/skills/officecli-pptx && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "officecli-pptx" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills/officecli-pptx into .gemini/skills/officecli-pptx/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "officecli-pptx", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install FerroxLabs/wayland officecli-pptxInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add FerroxLabs/wayland --skill officecli-pptx -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .github/skills && cp -r skills-src/src/process/resources/skills/officecli-pptx .github/skills/officecli-pptx && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "officecli-pptx" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills/officecli-pptx into .github/skills/officecli-pptx/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "officecli-pptx", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FerroxLabs/wayland --skill officecli-pptx -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install FerroxLabs/wayland officecli-pptx --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/src/process/resources/skills/officecli-pptx .opencode/skills/officecli-pptx && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "officecli-pptx" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills/officecli-pptx into .opencode/skills/officecli-pptx/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "officecli-pptx", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
officecli-pptxUse this skill any time a .pptx file is involved -- as input, output, or both.
Officecli PPTX is an agent skill from FerroxLabs/wayland. Use this skill any time a .pptx file is involved -- as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file; editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions 'deck', 'slides', 'presentation', 'pitch', or references a .pptx filename.
Its SKILL.md is about 11k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Documents & Office, covering PowerPoint presentations and Slides and decks. It works with Microsoft PowerPoint and Bash. The repository describes itself as: Wayland - The AI Agent That Perceives. Reasons. Acts. Evolves. The licence is AGPL-3.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 4c030c7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Officecli PPTX loads about 11k tokens when it runs. Until then it costs about 121 tokens; SKILL.md has 3,668 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from FerroxLabs/wayland at commit 4c030c7, republished under its AGPL-3.0 licence (© FerroxLabs). 3,668 words, ~10,703 tokens.
.claude/skills/officecli-pptx/SKILL.md (or your agent's skills folder).Wayland Desktop supplies a checksum-pinned native officecli runtime. Do not install, update, download, or replace it from this skill.
Run officecli --version before authoring. The native low-level contract requires the exact verified 1.0.136 version; use officecli --help to verify the top-level commands. If the runtime is missing, incompatible, or unverified, stop native authoring and use Wayland's reinstall/update recovery path. Never curl an installer, invoke PowerShell bootstrap code, or fall back to the separately hosted-credit generator without explicit network and cost approval.
This skill teaches what good slides look like, not every command flag. When a property name, enum value, or alias is uncertain, consult help BEFORE guessing.
officecli help pptx # List all pptx elements
officecli help pptx <element> # Full element schema (e.g. shape, chart, animation, connector, zoom, group, background)
officecli help pptx <verb> <element> # Verb-scoped (e.g. add shape, set slide)
officecli help pptx <element> --json # Machine-readable schemaHelp reflects the installed CLI version. When skill and help disagree, help is authoritative. Triggers to run help immediately: UNSUPPORTED props: warning, unknown animation preset, connector.shape= enum drifts, prop-vs-alias (lineWidth vs line.width, color vs font.color).
Shell quoting (zsh / bash). ALWAYS quote element paths ("/slide[1]/...") - zsh globs unquoted [1] to no matches found. Escapes happen at two layers; the CLI handles one for you:
$ in a value still belongs to the shell - single-quote the whole value: --prop text='$15M'. Double-quoted "$15M" gets expanded to M. The CLI does NOT unescape \$ for you.text=). The two-char escapes \n and \t ARE interpreted, consistently across pptx / docx / xlsx - \n is a line / paragraph break, \t is a tab. To produce a literal backslash-n in text, double it (\\n); this is rarely what you want."\n" / "\t" inside a <<'EOF' heredoc; both forms produce the same result.If in doubt, view text after writing and compare character-for-character.
Incremental execution. One command → check exit code → continue. A 50-command script that fails at command 3 cascades silently. After any structural op (new slide, chart, animation, connector) run get before stacking more.
These are the deliverable standards every deck MUST meet. Violating any one = not done, regardless of content quality.
One idea per slide. If a slide needs a second title to explain what it covers, split it. Dense "everything about X" slides lose the audience inside 3 seconds. Use a section divider to group related one-idea slides, not a mega-slide.
Explicit type hierarchy - do NOT rely on theme defaults. Theme defaults drift between masters. Set sizes explicitly on every text shape.
| Element | Minimum | Typical | Min shape height |
|---|---|---|---|
| Slide title | ≥ 36pt bold | 36–44pt | ≥ 2cm |
| Section / subtitle | ≥ 20pt | 20–24pt | ≥ 1.2cm |
| Body text | ≥ 18pt | 18–22pt | ≥ 1cm |
| Caption / axis label | ≥ 10pt muted | 10–12pt | ≥ 0.6cm |
Rule of thumb: min shape height ≈ font_pt × 0.05cm. An 18pt sublabel in a 0.8cm-tall box will overflow - view annotated catches this.
Title must be ≥ 2× body size (36pt over 20pt works; 28pt over 20pt looks timid). Four legit exceptions to body ≥ 18pt: chart axis labels, legends, footer / page number, and ≤ 5-word KPI sublabels (e.g. "Active users"). Descriptive sentences must be ≥ 18pt. Left-align body; center only titles and hero numbers. If "the cards won't fit", drop cards instead of shrinking font.
Two fonts max, one palette. One heading font + one body font (e.g. Georgia + Calibri). One dominant brand color (60–70% weight) + one supporting + one accent. Never mix 4+ colors in body content.
Every slide carries a non-text visual. Shape, chart, icon, gradient band. A bullet-only deck is interchangeable with a Word doc. Exceptions: literal quote slides, code blocks, a single summary-table slide.
Speaker notes on every content slide. --type notes --prop text="...". The speaker needs a script; the audience shouldn't read the slide verbatim.
Preserve existing templates. When a file already has a theme and masters, match them. Existing conventions override these guidelines.
Before declaring done, the per-slide render (see QA) MUST satisfy:
{{name}}, $fy$24, <TODO>, lorem, xxxx, empty ()/[] in chart titles never appear.x + width ≤ 33.87cm AND y + height ≤ 19.05cm. get and check - don't eyeball.1E2761, 36454F, 000000, deep forest / berry / cherry), every run of body text, card body, chart series fill, and icon color must be FFFFFF or brightness > 80%. Mid-gray (6B7B8D ≈ 44%) reads fine on a laptop and vanishes on projection. Verify via view html after the dark-fill pass.\$ literals in slide text. If view text shows a literal \$, the shell didn't unescape it (the CLI does NOT interpret \$). Single-quote the value: --prop text='$15M'. Note: \n and \t ARE interpreted as a real paragraph break / tab; seeing those as literals means the value was double-escaped (\\n).If any fails, STOP and fix before declaring done.
KPI text must fit the card - pre-compute, don't eyeball. In a 7cm-wide card at 60pt Georgia bold, values with $ and . (wide glyphs) wrap at 4 characters. $9.4M breaks the card; use $9M + "USD millions" sublabel, or move to the 3-card 9.78cm layout. Upper bound: max_size_pt ≈ card_width_cm × denom, where denom = 10 for 1–2 chars, 7 for 3–4 chars, 5 for 5+ chars.
layout=blank and alt textlayout=blank is the default for custom designs. Titles become plain shape elements, not placeholders. view outline / view issues reporting (untitled) / Slide has no title is expected, not a defect. Use layout=title + placeholder[title] only when screen-reader outline compatibility matters.view stats "Pictures without alt text: 0" is a false-positive zero (alt auto-fills to filename) - verify via view annotated.A deck is not a document. The audience has 3 seconds to get each slide. Before adding anything, ask: "If the audience reads only the biggest element and glances once, do they get the point?" If they have to read the bullets, the biggest element is wrong.
Standard widescreen is 33.87 × 19.05cm. Treat it as a 12-column grid internally:
usable = 33.87 − 2·margin − (N−1)·gap, then col_width = usable / N. Don't hand-pick x coordinates.Two fonts max - one for headings, one for body. Pair by document register, not by novelty. "Best For" is a prompt, not a decree; if the topic matches a row, use it as the default and move on.
| Header | Body | Best For |
|---|---|---|
| Georgia | Calibri | Formal business, finance, executive reports |
| Arial Black | Arial | Bold marketing, product launches |
| Calibri | Calibri Light | Clean corporate, minimal design |
| Cambria | Calibri | Traditional professional, legal, academic |
| Trebuchet MS | Calibri | Friendly tech, startups, SaaS |
| Impact | Arial | Bold headlines, event decks, keynotes |
| Palatino | Garamond | Elegant editorial, luxury, nonprofit |
| Consolas | Calibri | Developer tools, technical / engineering |
Set both fonts explicitly on every shape (--prop font=Georgia on title shapes, --prop font=Calibri on body shapes) - theme-default inheritance drifts between masters.
One dominant color does 60–70% of visual weight, two supporting tones, one accent used sparingly. Never use 4+ colors in body content. Columns are: Primary (dominant - the one color you see first), Secondary (the supporting tone), Accent (sparing, one-hit emphasis), Text (body on light fills), Muted (captions / axis labels / footer).
| Theme | Primary | Secondary | Accent | Text | Muted |
|---|---|---|---|---|---|
| Coral Energy | F96167 | F9E795 | 2F3C7E | 333333 | 8B7E6A |
| Midnight Executive | 1E2761 | CADCFC | FFFFFF | 333333 | 8899BB |
| Forest & Moss | 2C5F2D | 97BC62 | F5F5F5 | 2D2D2D | 6B8E6B |
| Charcoal Minimal | 36454F | F2F2F2 | 212121 | 333333 | 7A8A94 |
| Warm Terracotta | B85042 | E7E8D1 | A7BEAE | 3D2B2B | 8C7B75 |
| Berry & Cream | 6D2E46 | A26769 | ECE2D0 | 3D2233 | 8C6B7A |
| Ocean Gradient | 065A82 | 1C7293 | 21295C | 2B3A4E | 6B8FAA |
| Teal Trust | 028090 | 00A896 | 02C39A | 2D3B3B | 5E8C8C |
| Sage Calm | 84B59F | 69A297 | 50808E | 2D3D35 | 7A9488 |
| Cherry Bold | 990011 | FCF6F5 | 2F3C7E | 333333 | 8B6B6B |
Pick by topic, not by default - finance reads Midnight Executive, a product launch reads Coral Energy, safety / LOTO reads Cherry Bold. If the closest named theme is not quite right, blend (e.g. Forest primary + gold D4A843 accent). Use Text on light fills, Muted for captions / axis / footer, FFFFFF or Secondary for body on dark fills.
On dark backgrounds, text and chart series follow the Hard rules contrast floor above.
Wrong chart type kills the 3-second test:
| Data shape | Use | Avoid |
|---|---|---|
| Category comparison (A vs B vs C) | column (vertical) / bar (≥ 6 categories, horizontal) | pie (slices merge), line (no time axis) |
| Time series, 1–3 series | line | area (occlusion), bar (implies discrete) |
| Part-of-whole, 2–5 slices | pie / doughnut | pie with 8+ slices (unreadable) |
| Correlation / distribution | scatter | line (implies ordering) |
| Multiple categories × metrics, dense | stacked column or heatmap | one chart per metric - consolidate |
| KPI snapshot (single big number) | Large-text shape (60–72pt + ≤ 5-word sublabel), NOT a chart | gauge chart, tiny bar |
Rule of thumb: if > 3 series and > 8 categories, split into two charts or switch to a table.
Each animation is a cognitive interrupt. Limits:
fade, appear, or a single zoom-entrance on a hero slide.bounce, swivel, fly-from-edge, spin, multi-object choreography.Vary layout across slides - repeating the same pattern makes every slide feel identical. Pick one per slide from these building blocks:
| Pattern | When to use | Key measurement |
|---|---|---|
| Two-column (text left, visual right) | Concept + evidence; feature + screenshot | Each col ≈ 14-15cm; gap 1cm |
| Icon rows (icon in filled circle + bold header + description) | Feature lists, benefits, team roles | Icon circle 1.5-2cm; 3-4 rows max |
| 2×2 or 2×3 grid (card tiles) | Quadrant analysis, SWOT, option comparison | Gap ≥ 0.76cm; consistent card height |
| Half-bleed image (full left or right half, content overlay on other side) | Hero moments, case study openers | Image 16-17cm wide; content column ≥ 14cm |
| Large stat callout (60-72pt number + ≤5-word sublabel below) | Single KPI, milestone, market size | Use shape, NOT a chart; sublabel 14-16pt muted |
Data display quick rules:
shape with 60-72pt bold for a single KPI.Pick ONE distinctive element (rounded image frames, section numbers in filled circles, single-side border band, diagonal accent strips) and carry it to every slide. Declare it in your build plan first: ## Motif: numbered circles in brand color.
These are the patterns that make a deck look AI-generated or amateur:
officecli open <file> at start + officecli close <file> at end. Resident is the default, not an optimization. Use batch for repetitive shape grids.officecli create "$FILE". Existing: officecli view "$FILE" outline first. Never edit blind.--index on slide add works, but linear append keeps the build script readable and avoids index-arithmetic bugs. Before final delivery, confirm slide count + narrative arc match your build plan. Gate 3's order-sanity check catches cases where the cover ends up as slide 11 of 14 instead of slide 1.layout=blank for custom designs. After each structural op, get /slide[N] --depth 1 to confirm shape IDs.officecli close writes the ZIP. Always open in the target presentation viewer before shipping - chart colors, animations, fonts, and zoom are runtime features view html can't render. Full verification in QA below.Minimal viable deck: cover + one content slide + notes. $FILE stands in for your filename.
FILE="deck.pptx"
officecli create "$FILE"
officecli open "$FILE"
# Cover - dark fill, centered title
officecli add "$FILE" / --type slide --prop layout=blank --prop background=1E2761
officecli add "$FILE" /slide[1] --type shape --prop text="FY26 Strategic Review" \
--prop x=2cm --prop y=7cm --prop width=29.87cm --prop height=3cm \
--prop font=Georgia --prop size=44 --prop bold=true --prop color=FFFFFF --prop align=center
# Content - white fill, title + body + notes
officecli add "$FILE" / --type slide --prop layout=blank --prop background=FFFFFF
officecli add "$FILE" /slide[2] --type shape --prop text="Revenue grew 18% YoY" \
--prop x=1.5cm --prop y=1.2cm --prop width=30cm --prop height=2cm \
--prop font=Georgia --prop size=36 --prop bold=true --prop color=1E2761
officecli add "$FILE" /slide[2] --type shape --prop text="Enterprise renewals + new EMEA region drove the beat; NRR held at 118%." \
--prop x=1.5cm --prop y=4cm --prop width=30cm --prop height=3cm \
--prop font=Calibri --prop size=20 --prop color=333333
officecli add "$FILE" /slide[2] --type notes --prop text="Lead with the 18% beat, preview EMEA."
officecli close "$FILE"
officecli validate "$FILE"Shape of every build: open → slide+background → title → body → notes → close → validate.
Start wide, then narrow. outline first, view text / get / query once you know where to look.
officecli view "$FILE" outline # slide count + titles
officecli view "$FILE" annotated # complete per-slide breakdown with fonts, sizes, tables, charts
officecli view "$FILE" text --start 1 --end 5 # text dump (does NOT extract table cells - use get)
officecli view "$FILE" issues # empty slides, overflow hints
officecli view "$FILE" stats # counts + missing alt (false-positive zero - verify via view annotated)Inspect one element. XPath-style paths, 1-based. ALWAYS quote. Prefer @name= / @id= selectors over positional [N] (stable across reorderings). [last()] works. Add --json for machine output.
officecli get "$FILE" "/slide[1]" --depth 1 # shape list with IDs and names
officecli get "$FILE" "/slide[1]/shape[@name=Title]"
officecli get "$FILE" "/slide[1]/table[1]" --depth 3 # table rows / cellsQuery across the deck. CSS-like selectors; operators =, !=, ~=, >=, <=, [attr], :contains(), :no-alt. help pptx query lists queryable element types.
officecli query "$FILE" 'shape:contains("Revenue")'
officecli query "$FILE" 'picture:no-alt' # accessibility gap
officecli query "$FILE" 'shape[fill=1E2761]' # color match
officecli query "$FILE" 'shape[width>=10cm]' # numericquery --json output schema. Results wrap in .data.results[] - jq -r '.data.results[0].format.id', NOT .[0].id. Shape name is .name; fill is .format.fill; textColor is .format.textColor.
Visual preview (LEAD).
officecli view "$FILE" html # prints an HTML preview path; Read it for per-slide visual audit (best structural ground truth)
officecli view "$FILE" svg --start 3 --end 3 # single slide SVG (charts + gradients do NOT render in SVG)Verbs: add / set / remove / move / swap / batch / raw-set. Ninety percent of a deck is slides, shapes, text, a few charts, pictures, connectors.
A slide is /slide[N]. Always pass layout=blank for custom designs. Background: solid, gradient, or image.
officecli add "$FILE" / --type slide --prop layout=blank --prop background=1E2761 # solid
officecli add "$FILE" / --type slide --prop layout=blank --prop "background=1E2761-CADCFC-180" # gradient (start-end-angle)
officecli add "$FILE" / --type slide --prop layout=blank --prop "background.image=hero.jpg" # image background (LEAD)A shape holds text, fill, border, position, and optional animation / link.
officecli add "$FILE" /slide[2] --type shape --prop name=Title --prop text="Key Insight" \
--prop x=2cm --prop y=2cm --prop width=20cm --prop height=3cm \
--prop font=Georgia --prop size=36 --prop bold=true --prop color=1E2761 --prop fill=nonePositioning is explicit - no layout engine, you own the grid math. --prop preset= picks geometry (rect, roundRect, ellipse, triangle, arrow, star5, ...); custom M...Z paths are not supported - pick a preset. Name shapes at creation (--prop name=HeroTitle) and address later with "/slide[N]/shape[@name=HeroTitle]" - positional /shape[3] breaks after any z-order / remove.
Prefer
@name=over@id=. Names you set yourself survive remove-then-add and z-order ops cleanly. After any structural change, re-get --depth 1before referencing positional indexes.
A shape has paragraphs (paragraph[K]) and runs. For one-line text, --prop text= on the shape is enough. Multi-line or mixed styling:
# add --type paragraph accepts only text + align; styling goes through a follow-up set or an add --type run:
officecli add "$FILE" "/slide[2]/shape[@name=Card1]" --type paragraph --prop text="First bullet"
officecli set "$FILE" "/slide[2]/shape[@name=Card1]/paragraph[1]" --prop bold=true --prop size=20 --prop color=FFFFFF
# Styled run in one step:
officecli add "$FILE" "/slide[2]/shape[@name=Card1]/paragraph[1]" --type run \
--prop text=" (inline detail)" --prop size=14 --prop italic=true --prop color=8899BBFor real newlines inside one run, use a batch heredoc with JSON "\n". Shell-quoted \n in --prop text= is NOT interpreted.
Pick chart type per the Design Principles chart-choice table. Full prop list (chartType enum, seriesN.*, data=/categories=, axis options): help pptx add chart. Typical multi-series with brand colors:
officecli add "$FILE" /slide[3] --type chart --prop chartType=column \
--prop series1.name=Revenue --prop series1.values="42,45,48" --prop series1.color=1E2761 \
--prop series2.name=Growth --prop series2.values="2,7,7" --prop series2.color=CADCFC \
--prop categories="Q1,Q2,Q3" \
--prop x=2cm --prop y=4cm --prop width=20cm --prop height=10cmGotchas: (1) series cannot be added after creation - include all series at add time or remove + re-add. (2) chart titles with (), [], TBD ship as literal text. (3) some viewers normalize chart colors to theme defaults - verify in the target viewer.
officecli add "$FILE" /slide[4] --type picture --prop src=hero.jpg \
--prop x=1cm --prop y=1cm --prop width=32cm --prop height=18cm \
--prop alt="Product hero, gradient lit from right"Confirm with officecli query "$FILE" 'picture:no-alt' - must be empty before delivery (but remember view stats is a false-positive zero because alt auto-fills to filename).
Draws a line between two shapes or free coordinates. Full prop / enum reference (shape, headEnd/tailEnd values, from/to ref forms): help pptx add connector.
officecli add "$FILE" /slide[5] --type connector \
--prop "from=/slide[5]/shape[@name=BoxA]" --prop "to=/slide[5]/shape[@name=BoxB]" \
--prop shape=elbow --prop color=333333 --prop tailEnd=triangleEvery flow connector needs an arrowhead. Without one, bentConnector3 renders as a directionless line. preset=rightArrow overlay only works for horizontal flows; diamonds / decision trees with diverging edges need tailEnd=.
One preset per slide, ≤ 600ms. Preset names + duration syntax: help pptx animation.
officecli set "$FILE" "/slide[2]/shape[@name=HeroCard]" --prop animation=fade-entrance-400
officecli set "$FILE" "/slide[2]/shape[@name=HeroCard]" --prop animation=none # clear all--prop link=slide:N for slide-jump, link=https://... for URL, --prop tooltip="..." for hover text. (Help only documents the URL form - slide:N is skill-only knowledge.)
--type table --prop rows=N --prop cols=M. Row-level set supports height, header, c1/c2/c3. Cell formatting lives on the cell paragraph / run. Populate rows BEFORE setting table-level font (font cascade gets reset by row ops)."/slide[N]/placeholder[title]" / placeholder[body]. Available only when the slide uses a layout with placeholders (not layout=blank)."/slide[N]/group[@name=G]/shape[1]". Survives reordering better than positional indexes.--type zoom --prop targets="3,7,15". Section-navigation hub. Zoom is a runtime feature - view html shows the static geometry; the zoom interaction runs only in a live presentation viewer./slide[N]/comment[M]. Full lifecycle (add / set / get / query / remove). Props: text, author, initials (auto-derived), date (ISO 8601, defaults to UtcNow), x / y (length anchor).officecli add "$FILE" "/slide[2]" --type comment --prop author="Alice" --prop text="Tighten this bullet" --prop x=20cm --prop y=3cm
officecli query "$FILE" 'comment' --json | jq '.data.results | length' # count all review comments
officecli remove "$FILE" "/slide[2]/comment[1]" # resolve after addressingPatterns not obvious from the primitives. Each gives the visual outcome first, then a runnable block. $FILE = your filename. Use /slide[last()] to address the slide you just added.
Z-order. Later-added shapes are on top. Add background decoration FIRST, titles LAST. To fix after the fact: --prop zorder=back/front (renumbers siblings - re-get --depth 1 before stacking more).
Visual outcome. Dark navy fill, centered 44pt title, 18pt ice-blue meta line.
officecli add "$FILE" / --type slide --prop layout=blank --prop background=1E2761
officecli add "$FILE" "/slide[last()]" --type shape --prop text="Strategic Growth Review" \
--prop x=2cm --prop y=7cm --prop width=29.87cm --prop height=3cm \
--prop font=Georgia --prop size=44 --prop bold=true --prop color=FFFFFF --prop align=center
officecli add "$FILE" "/slide[last()]" --type shape --prop text="Prepared for Acme Leadership - FY26 Outlook" \
--prop x=2cm --prop y=11cm --prop width=29.87cm --prop height=1.2cm \
--prop font=Calibri --prop size=18 --prop color=CADCFC --prop align=centerSection divider = same cover, plus a giant translucent number (size=120, opacity=0.15) added FIRST so it sits behind the section title.
Visual outcome. Left two-thirds: column chart with brand series colors. Right one-third: "Key Insight" card with 20pt heading + 18pt body - audience reads the takeaway before parsing the bars.
officecli add "$FILE" / --type slide --prop layout=blank --prop background=FFFFFF
officecli add "$FILE" "/slide[last()]" --type shape --prop text="FY26 Revenue Beat Plan by 18%" \
--prop x=1.5cm --prop y=1cm --prop width=30cm --prop height=1.8cm \
--prop font=Georgia --prop size=36 --prop bold=true --prop color=1E2761
# Chart - left 2/3 (single-quote the title because of `$`)
officecli add "$FILE" "/slide[last()]" --type chart --prop chartType=column \
--prop series1.name=Actual --prop series1.values="42,45,48,55" --prop series1.color=1E2761 \
--prop series2.name=Plan --prop series2.values="40,42,45,48" --prop series2.color=CADCFC \
--prop categories="Q1,Q2,Q3,Q4" --prop x=1.5cm --prop y=3.5cm --prop width=20cm --prop height=14cm --prop title='FY26 Revenue ($M)'
# Commentary card - right 1/3: background + heading + body
officecli add "$FILE" "/slide[last()]" --type shape --prop preset=roundRect --prop fill=F5F7FA --prop line=none \
--prop x=22.5cm --prop y=3.5cm --prop width=9.8cm --prop height=14cm
officecli add "$FILE" "/slide[last()]" --type shape --prop text="Key Insight" \
--prop x=23cm --prop y=4cm --prop width=9cm --prop height=1.2cm \
--prop font=Georgia --prop size=20 --prop bold=true --prop color=1E2761
officecli add "$FILE" "/slide[last()]" --type shape --prop text="EMEA launch + NRR at 118% drove 12pp of the 18pp beat." \
--prop x=23cm --prop y=5.5cm --prop width=9cm --prop height=11cm \
--prop font=Calibri --prop size=18 --prop color=333333Visual outcome. Four rounded boxes across at y=8cm, each 6×3cm, alternating navy/iceblue, joined by elbow connectors with triangle arrowheads.
Grid math (4 boxes, 33.87cm slide, 1.5cm margins): gap = (33.87 − 3 − 24) / 3 = 2.29cm. x-positions: 1.5, 9.79, 18.08, 26.37.
Each box carries its own label via valign=middle (no separate overlay shape needed). Use batch heredoc for portable coordinate arithmetic - no bc, no bash arrays.
cat <<EOF | officecli batch "$FILE"
[
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"name":"Step1","preset":"roundRect","fill":"1E2761","line":"none","x":"1.5cm","y":"8cm","width":"6cm","height":"3cm","text":"Step 1","font":"Georgia","size":"20","bold":"true","color":"FFFFFF","align":"center","valign":"middle"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"name":"Step2","preset":"roundRect","fill":"CADCFC","line":"none","x":"9.79cm","y":"8cm","width":"6cm","height":"3cm","text":"Step 2","font":"Georgia","size":"20","bold":"true","color":"1E2761","align":"center","valign":"middle"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"name":"Step3","preset":"roundRect","fill":"1E2761","line":"none","x":"18.08cm","y":"8cm","width":"6cm","height":"3cm","text":"Step 3","font":"Georgia","size":"20","bold":"true","color":"FFFFFF","align":"center","valign":"middle"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"name":"Step4","preset":"roundRect","fill":"CADCFC","line":"none","x":"26.37cm","y":"8cm","width":"6cm","height":"3cm","text":"Step 4","font":"Georgia","size":"20","bold":"true","color":"1E2761","align":"center","valign":"middle"}}
]
EOF
# Connector pattern - reuse for any box-to-box graph.
for pair in "Step1 Step2" "Step2 Step3" "Step3 Step4"; do
A=${pair% *}; B=${pair#* }
officecli add "$FILE" "/slide[$SLIDE]" --type connector \
--prop "from=/slide[$SLIDE]/shape[@name=$A]" \
--prop "to=/slide[$SLIDE]/shape[@name=$B]" \
--prop shape=elbow --prop color=333333 --prop tailEnd=triangle
doneshape=elbow is canonical (bentConnector3 also works; bentConnector2 is rejected). query --json results are in .data.results[] - use .data.results[0].format.id, not .[0].id.
No code block - it's a rhythm. Alternate dark divider slides with white content slides using the recipes above:
Visual outcome. Three or four giant numbers across a row; each card = unit sublabel + small percent-change chip + one-line takeaway. The single most common exec-deck element.
Sizing rule. 60pt Georgia bold fits ~5 chars in a 9.78cm card ($84.2, 118%, 24.5). For longer values ($84.2M), split: $84.2 as the big number, USD millions as the sublabel - never shrink the font to chase a unit suffix, it just wraps.
Grid math (3 cards, 1.5cm margins, 0.76cm gap): col_width = (33.87 − 3 − 1.52) / 3 = 9.78cm. x-positions: 1.5, 12.04, 22.58. Use accent color on a single "watch" card so risk reads in one second.
# Two cards: navy standard + terracotta watch. Each = bg + big number + sublabel + chip.
cat <<EOF | officecli batch "$FILE"
[
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"preset":"roundRect","fill":"1E2761","line":"none","x":"1.5cm","y":"4cm","width":"9.78cm","height":"7cm"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"text":"84.2","x":"1.5cm","y":"4.8cm","width":"9.78cm","height":"2.8cm","font":"Georgia","size":"60","bold":"true","color":"FFFFFF","align":"center"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"text":"USD millions · ARR","x":"1.5cm","y":"8cm","width":"9.78cm","height":"0.8cm","font":"Calibri","size":"14","color":"CADCFC","align":"center"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"text":"+24% YoY","x":"1.5cm","y":"9cm","width":"9.78cm","height":"0.8cm","font":"Calibri","size":"14","bold":"true","color":"CADCFC","align":"center"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"preset":"roundRect","fill":"B85042","line":"none","x":"22.58cm","y":"4cm","width":"9.78cm","height":"7cm"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"text":"$1.42","x":"22.58cm","y":"4.8cm","width":"9.78cm","height":"2.8cm","font":"Georgia","size":"60","bold":"true","color":"FFFFFF","align":"center"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"text":"CAC payback (yrs)","x":"22.58cm","y":"8cm","width":"9.78cm","height":"0.8cm","font":"Calibri","size":"14","color":"FFFFFF","align":"center"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"text":"+8% - watch","x":"22.58cm","y":"9cm","width":"9.78cm","height":"0.8cm","font":"Calibri","size":"14","bold":"true","color":"FFFFFF","align":"center"}}
]
EOFVisual outcome. Diamond at top-center; YES/NO child boxes diverging left-right; both converge into a shared terminal box. Layout: diamond at x=13.94, y=2cm, 6×3cm; YES at 3cm, 7.5cm; NO at 22.87cm, 7.5cm; terminal at 13.94cm, 13cm. Convention: red = stop/escalate, blue = standard, green = safe terminal. Every connector needs an arrowhead - readers misparse direction otherwise.
cat <<EOF | officecli batch "$FILE"
[
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"name":"Decide","preset":"diamond","fill":"1E2761","line":"none","x":"13.94cm","y":"2cm","width":"6cm","height":"3cm","text":"Hazardous energy present?","font":"Calibri","size":"14","bold":"true","color":"FFFFFF","align":"center","valign":"middle"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"name":"YesBox","preset":"roundRect","fill":"B85042","line":"none","x":"3cm","y":"7.5cm","width":"8cm","height":"3cm","text":"Lockout + Tagout + Verify","font":"Calibri","size":"16","bold":"true","color":"FFFFFF","align":"center","valign":"middle"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"name":"NoBox","preset":"roundRect","fill":"CADCFC","line":"none","x":"22.87cm","y":"7.5cm","width":"8cm","height":"3cm","text":"Proceed with standard PPE","font":"Calibri","size":"16","bold":"true","color":"1E2761","align":"center","valign":"middle"}},
{"command":"add","parent":"/slide[$SLIDE]","type":"shape","props":{"name":"Done","preset":"roundRect","fill":"2C5F2D","line":"none","x":"13.94cm","y":"13cm","width":"6cm","height":"2.5cm","text":"Begin service","font":"Calibri","size":"16","bold":"true","color":"FFFFFF","align":"center","valign":"middle"}}
]
EOFThen 4 connectors (Decide→YesBox, Decide→NoBox, YesBox→Done, NoBox→Done) using the connector loop pattern from (c).
Assume there are problems. First render is almost never correct. If you found zero issues, you were not looking hard enough.
Gates 1–2b are text/schema-level (cannot see a rendered slide); Gate 3 is the only visual check. Done = every gate PASS and Gate 3 loop converged.
FILE="deck.pptx"
# Gate 1 - schema
officecli validate "$FILE" && echo "Gate 1 OK" || { echo "REJECT Gate 1"; exit 1; }
# Gate 2 - overflow / format / structure (drop expected layout=blank "no title" noise)
ISSUES=$(officecli view "$FILE" issues 2>&1 | grep -vE "Slide has no title")
echo "$ISSUES" | grep -qE "^\s*\[[A-Z][0-9]+\]" && { echo "REJECT Gate 2:"; echo "$ISSUES"; exit 1; } || echo "Gate 2 OK"
# Gate 2b - leftover placeholders ("xxxx", "lorem", "<TODO>", empty (), [], "this slide layout")
LEFT=$(officecli view "$FILE" text | grep -niE 'xxxx|lorem|ipsum|<todo>|placeholder|this[- ]slide[- ]layout|\(\)|\[\]')
[ -n "$LEFT" ] && { echo "REJECT Gate 2b:"; echo "$LEFT"; exit 1; } || echo "Gate 2b OK"Pick one path:
Screenshot (default) - needs image-Read + a headless browser. Loop per slide (viewport screenshot covers only slide 1):
n=1
while officecli view "$FILE" screenshot --page $n -o "/tmp/gate3_$n.png" 2>/dev/null; do
n=$((n+1))
done
[ $n -eq 1 ] && { echo "no headless backend - using fallback"; SCREENSHOT_FAILED=1; }Read each PNG against the checklist; delegate to a subagent when the harness has one.
Fallback - HTML-text (no image-Read or no browser): read view "$FILE" html as text. DOM cannot prove dark-on-dark / fine overlap / arrowheads / gap-margin metrics / column alignment - flag these as "not visually verified" rather than PASS.
Optional --grid N - only on user request for layout-rhythm, or when view outline shows anomalous layout distribution: officecli view "$FILE" screenshot --grid 3 -o /tmp/grid.png.
Per-slide checklist (assume issues exist):
REJECT with slide N: <issue> lines, else "Gate 3 PASS" (HTML-text fallback adds "<unverified-items> not visually verified").
Fix-verify (mandatory, max 3 cycles). Fix → re-run Gate 3 → repeat until zero new issues; one fix often surfaces another. After 3 rounds without convergence, stop - likely seesaw, template-level cause, or agent misread. Report slide N: <issue> - attempted: <fixes> - likely root: <template|design-conflict|ambiguous> and let the user decide.
Sanity-check cheatsheet - what breaks on the first try. Design + shell traps.
| Pitfall | Correct approach |
|---|---|
Unquoted [N] in zsh/bash | Always quote paths: "/slide[1]". zsh globs unquoted [1] → no matches found - #1 first-use stumble |
--name "foo" | All attributes go through --prop: --prop name="foo" |
/shape[myname] (bare name in brackets) | Use @name= selector: /shape[@name=myname] or /shape[@id=10007] |
Paths 1-based vs --index 0-based | /slide[1] = first slide; --index 0 = first position |
$ in --prop text= | Single-quote: --prop text='$15M'. Double-quoted "$15M" gets shell-expanded to M |
\n / \t in --prop text= | CLI does NOT interpret. Use multiple --type paragraph, or batch heredoc with JSON "\n" |
© FerroxLabs, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in src/process/resources/skills/officecli-pptx of FerroxLabs/wayland.
Open the folder on GitHubat commit 4c030c7
We found 4 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 4 other GitHub owners. This page covers the copy in FerroxLabs/wayland, which our catalogue first saw on October 7, 2026.
Officecli PPTX next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Officecli PPTX this skillFerroxLabs/wayland | 608 | 4 repos | ~11k | Automated safety check: Pass | AGPL-3.0 | |
| Image To Editable Pptningzimu/image-to-editable-ppt-skill | 2.8k | — | ~4.3k | Automated safety check: Pass | MIT | |
| Slidesfcakyon/claude-codex-settings | 1.2k | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Ppt Image FirstNyxTides/ppt-image-first | 1.2k | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| Gpt Image2 PptJuneYaooo/gpt-image2-ppt-skills | 1.3k | — | ~8.9k | Automated safety check: Notes | Apache-2.0 | |
| HTML Slide To PPTXmucsbr/ppt-agent-workflow-san | 643 | — | ~1.1k | Automated safety check: Pass | None |
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.
fcakyon/claude-codex-settings
Create and edit presentation slide decks (.pptx) with PptxGenJS, bundled layout helpers, and render/validation utilities.
NyxTides/ppt-image-first
Build presentation plans for PPT / slides / decks through a conversation-first workflow, then propose multiple visual directions with preview images before writing deck specs.
JuneYaooo/gpt-image2-ppt-skills
Generate visually striking PPT slides via OpenAI's gpt-image-2 -- use any style in styles/<collection/STYLEID.md or mimic a user-supplied .pptx template; outputs high-res slide PNGs and a 16:9 .pptx.
mucsbr/ppt-agent-workflow-san
Convert structured single-slide or small deck HTML files into editable PPTX slides with native text boxes, shapes, chips, arrows, and panels.
zsyggg/paper-craft-skills
将论文、技术文章或知识内容制作成高真实感的 AIGC 幻灯片。先做叙事结构和逐页视觉导演,再调用生图模型生成每一页 16:9 slide image,最后合成为 PPTX/PDF。适合论文汇报、组会、公开课、技术分享、商业化研究展示;当用户提到“论文PPT”“AI生成PPT”“不像AI的PPT”“高质感幻灯片”“逐页生图PPT”时使用。
FerroxLabs/wayland
Install, start, connect, and troubleshoot visualization companion projects for Aion/OpenClaw, with Star-Office-UI as the default recommendation.
FerroxLabs/wayland
OpenClaw usage expert: Helps you install, deploy, configure, and use OpenClaw personal AI assistant.
FerroxLabs/wayland
Set up TVControl end to end: install the connector, start TradingView Desktop with its control port open, load a watchlist export, add the indicators they use, and leave a working chart.
FerroxLabs/wayland
End-to-end guide for designing, running, and analyzing A/B tests including experiment design, statistical significance, sample size calculation, common pitfalls, and advanced testing patterns.
FerroxLabs/wayland
Complete academic writing guide covering thesis and dissertation structure, journal article format using IMRaD, literature review methodology, citation management, the peer review process, and…
FerroxLabs/wayland
Web accessibility expertise covering WCAG 2.2 conformance, audit methodology, ARIA patterns, keyboard navigation, screen reader testing, focus management, form accessibility, and automated vs manual…
Works with
Categories
Use this skill any time a .pptx file is involved -- as input, output, or both. Officecli PPTX is an agent skill from FerroxLabs/wayland.pptx file is involved -- as input, output, or both.
Officecli PPTX fits situations like: ever the user mentions deck; references a .pptx filename.
Run `npx skills add FerroxLabs/wayland --skill officecli-pptx -a claude-code`. Or copy the skill folder (src/process/resources/skills/officecli-pptx in FerroxLabs/wayland) into .claude/skills/officecli-pptx in your project. Claude Code loads it when a task matches its description.
Run `npx skills add FerroxLabs/wayland --skill officecli-pptx -a codex`. Or copy the skill folder (src/process/resources/skills/officecli-pptx in FerroxLabs/wayland) into .agents/skills/officecli-pptx in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add FerroxLabs/wayland --skill officecli-pptx -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/officecli-pptx, .gemini/skills/officecli-pptx, .github/skills/officecli-pptx and .opencode/skills/officecli-pptx in your project.
Going by SKILL.md and its folder, Officecli PPTX needs the command-line tools its instructions call (jq).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Officecli PPTX is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 11k tokens (SKILL.md is roughly 43k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Officecli PPTX: Image To Editable Ppt (ningzimu/image-to-editable-ppt-skill, 2.8k stars), Slides (fcakyon/claude-codex-settings, 1.2k stars), Ppt Image First (NyxTides/ppt-image-first, 1.2k stars) and Gpt Image2 Ppt (JuneYaooo/gpt-image2-ppt-skills, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
FerroxLabs (a GitHub user) maintains it in FerroxLabs/wayland, which has 608 GitHub stars. The repository holds 1,194 skills in this directory. The repository was last updated on October 6, 2026.
Source: FerroxLabs/wayland on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.