Repository navigation
Releases: hugohe3/ppt-master
Release list
v6.7.3
Patch release: Edit Native and native-object fixes that stop a round trip from failing or silently replacing content, plus a readable fallback for native formulas outside PowerPoint.
Edit Native PPTX
- An explicit Morph pair whose endpoint sits on an otherwise unchanged page no longer crashes with
KeyError. The page keeps its source bytes, and only the shape name the pair needs is patched (604ecde). - Moving an imported object that kept its source text body (for example Office Math that could not be rebuilt as a formula) restores that text body at the new position. Before, any move rebuilt the formulas as plain text. Edits that do change the text still rebuild it, and now warn when native math would become plain text (2e1658c).
- Imported charts and block formulas rebuilt during a round trip keep their source shape id. Before, export stopped with "Edited slide removed source animation target(s)" (0db9d90, cd44568).
Native charts and formulas
- A new or rebuilt chart no longer takes the same part name as a chart restored from the source package. Before, the later write silently replaced the earlier chart's data. Exports without such a collision are byte-identical (970d9cc).
- Native formulas now include a fallback built from their SVG preview, so clients without Office Math support (LibreOffice, WPS) show the formula instead of nothing. PowerPoint keeps using the native math (dc7eab3).
- PPTX import rebuilds PPT Master formulas whose color is a theme color or translucent, instead of turning them into plain text boxes (029201f).
Live preview editor
- The preview canvas no longer stays blank with "SVG may be corrupted or missing the root
<svg>element", and Save no longer writesns0:-prefixed SVGs. This regression was only onmainafter v6.7.2. Thanks @ganeshmshetty (#323, #324).
Image to PPTX
- The profile now defines how page-pixel geometry maps to the SVG canvas, so native text and shapes stay aligned with the base layers when the canvas differs from the source size (f2a20a0, discussion #272).
Installation and docs
pip install -r requirements.txtno longer fails withUnicodeDecodeErroron Chinese Windows (GBK locale) (69634d6, discussion #321).- README and the positioning docs now name the optional services that send data off the machine: image generation, web image search, URL import and online narration (cc8b722, discussion #69).
v6.7.2
Patch release: fixes from an audit of the issue history. Most of them stop a tool from losing, overwriting or rewriting content while it reports success.
Installation and startup
- Skill-only installations create projects in your working folder again (703aa72, #144). Since v6.3.0,
project_manager.py initplaced projects relative to the installed skill. For annpx skillsor plugin installation, that meant.agents/projects/or the plugin cache, where an update can replace them. Inside a repository checkout nothing changes. - On Windows, a
python3that never starts (the WindowsApps stub exits 9009 with no output) is no longer treated as an integrity-guard failure; the agent retries withpythonfirst (e1b5873, follow-up on #142).
Source conversion and import
- PDF: removed four table rewrites that were written against one sample paper. They re-derived variable categories from hard-coded symbols, replaced headers, dropped rows and invented a correlation column. Extracted cells are now kept as extracted (3aa2ec6).
- HTML: pages are decoded by BOM and their charset declaration instead of forced UTF-8, so a
<meta charset="gbk">page no longer comes out as replacement characters. A guessed encoding is reported (34d88c1). - Web: pages with the same title in one batch get
Report.md,Report_2.mdinstead of overwriting each other (e847939). A raw.mdURL whose code fence shows<body>stays Markdown instead of being reduced to the example (6a92c1f). - import-sources:
.txtsources in GB18030 or other non-UTF-8 encodings are decoded instead of replaced (39b470f). Markdown with the same text but different companion images (<stem>_files/) is no longer treated as a duplicate and deleted (104bc3c). - PPTX import:
b="true"/i="true"now import as bold and italic, as"1"already did (8bdf440). Page-type classification matches whole words, so "Qatar" or "Department" no longer reads as a Q&A or chapter page (c0ce242).
Live preview editor
- Save All refuses to replay staged edits onto an SVG that changed after they were staged, keeping them staged with an error. Before, they landed on whichever element now sat at that position (05e627c).
- User ids that start with
_edit_are kept, anddy=".5"-style numbers are parsed correctly when a line is moved (264bd66).
Export, finalize and checker
- Proportional fonts such as Arial Unicode MS and Monotype Corsiva are no longer sized as monospace (c266856).
- Icons and illustrations marked with single-quoted
preserve-colororstroke='currentColor'keep their colors and style (05cf79c, 0cdf876). - The checker no longer fails a slide whose visible text reads
class=âĶ,onload=âĶor@import âĶ, or that carries adata-classattribute. Realclass, event and CSS-import usage still fails (8f00128, 923a536).
Images, narration and video
- Manifest images named like
hero.v2.pngno longer overwritehero.png(e9676c5). - Image search ranks by whole words: required "Iran" no longer accepts "Tirana", and the transit penalty no longer hits "business" or "trail" (d4ac79d, b827c5c).
- Page subtitles and notes follow numeric slide order past slide 9 and slide 99 (1036fd5). Narration keeps lines such as
#1 revenue grewand skips only real Markdown headings (06008e8).
Docs
- The FAQ no longer promises pixel-identical charts in Keynote, LibreOffice and WPS; Microsoft PowerPoint is the validation target (ac16c04).
v6.7.1
Patch release: fixes for work that the live preview, source conversion and source import could lose without a warning, plus a full pass over the UI strings in every language.
Live preview
- Unapplied annotations and direct edits now survive a server stop (1fa3768, #319). Before, they lived only in server memory, and the idle timeout, Exit preview,
--shutdown, a kill or a crash before Apply changes discarded them. Closing a laptop lid made this likely: the idle timer counted the suspend time, so the server exited on wake.- Every staging change is written to
live_preview/draft.jsonbefore it is acknowledged. The next start restores it and the UI lists the restored slides; you still decide when to apply. - A slide whose SVG changed in the meantime is not replayed onto it. Its draft is kept as
live_preview/draft_conflict_<timestamp>.jsonand the UI says so. - Exit preview now keeps the draft instead of discarding it. A failed draft write is reported in the UI.
- Apply changes keeps a slide staged when an annotated element no longer exists, instead of dropping the annotation. SVGs are written atomically, and a submit that finds nothing pending on the server is reported instead of shown as saved.
- Every staging change is written to
Source conversion and import
- Direct PDF/document/Excel/PowerPoint batches without
-ono longer let same-stem inputs (budget.xlsx+budget.xlsm) overwrite each other's Markdown while reporting success (8d630ff, #317). import-sourcesgives same-stem sources distinct archive stems, so the second one is converted and reaches the project (ca04346).- Notebook output images go to
<output-stem>_files/, so notebooks converted side by side no longer overwrite each other's images (e4a4c08).
UI strings and prompts
- Corrected the Simplified Chinese, Traditional Chinese and Japanese UI strings across the confirmation, spec review and live preview pages: meaning errors, stale strings, punctuation and consistent terms. Two stale English source strings were also fixed, and translation keys that nothing reads were dropped (5d613ea, ecb6269, bc3f51d, 5d806d2, df82a22, b684364).
- Workflow triggers, templates and candidate keys now follow the repo language rule (a517095). The user docs no longer say the communication recommendation is written without reading any template content (667b032). The Chinese docs are resynced with their English sources (e0e6576, 0b898cd).
- Thanks to @kevindesuyo for the whole UI-string and docs pass.
v6.7.0
Minor release: a browser review page for the design spec, Google's new Nano Banana 2.1 as the default Google image model, and fixes for content that source conversion and PPTX/SVG text round-trips used to lose without a warning.
Image generation
- Google image generation now defaults to Nano Banana 2.1 (
gemini-nano-banana-2.1, GA on 2026-10-06), on the Gemini, OpenRouter (google/gemini-nano-banana-2.1) and fal (google/nano-banana-2.1) backends. Google has deprecatedgemini-3.1-flash-image, but has not announced a shutdown date. Nano Banana 2.1 does not offer512px, so all three backends now reject512pxfor it before sending a request. The wide ratios1:4 4:1 1:8 8:1still work (35508e3).- If your
.envpinsGEMINI_MODEL=gemini-3.1-flash-image(or the OpenRouter/fal equivalent), that setting still wins over the new default. Update or remove the line to switch. - Removed the IDs
gemini-3.1-flash-image-previewandgemini-2.5-flash-image-preview; Google has shut both models down.
- If your
- OpenAI:
OPENAI_BACKGROUND=transparentis now accepted for GPT Image models, includinggpt-image-2(in preview at OpenAI), and is refused only together with JPEG output.gpt-image-2.5-sunburst/gpt-image-2.5-flareand their snapshots acceptOPENAI_QUALITY=xhigh|max.gpt-image-1-miniaccepts input fidelitylowonly. The default staysgpt-image-2(3f98568). - Backend fixes:
- Qwen 2K
2:3/3:2used to produce 3:4 / 4:3 images. - A Volcengine Ark base URL ending in
/api/v3no longer gets/api/v1appended. - Replicate now rejects
21:9, whichflux-1.1-prodoes not offer, before sending the request (06d8f0a).
- Qwen 2K
image_searchhalves originals above Pillow's decompression-warning size (481e057).slice_imageshandles three more cases (964d920, fd20665, adbfdf4):- a ground that is uneven but key-coloured;
- edges and shadows blended with the key colour;
- despill on a ground measured close to the key colour.
Design spec review
- New browser review page for
design_spec.md: one page per section, Part and slide. You can edit one block's Markdown directly. The edit is applied as an exact byte-range replacement with a hash precondition, and its schema is checked before it is written. You can also leave per-block or global comments, which go in a separate sidecar file and never into the spec.check_spec_annotations.pyhands both kinds of feedback to the agent (aec3202, 61ad7ae). - With
refine_specon, a run that confirmed on the page now also reviews the spec on the page; runs confirmed in chat keep reviewing in chat. Approval still happens in chat. Resume returns to Refine Spec if the spec changed after the lock (866efd8).
Source conversion
- DOCX, PPTX, Excel and web converters no longer drop content without a warning. Affected content included nested tables, content controls, endnotes and links inside tables, OMML separators, PPTX field text and numbering continuation, Excel hidden sheets, merged cells and number formats, and more (13ac724, 2d72da6).
pdf_to_mdkeeps body text that repeats a running header or footer, and keeps numeric or labelled paragraphs that sit between tables sharing a header (51c2979, 4eb7b3d). Typst text survives when pandoc cannot evaluate it (176235a).
PPTX â SVG text
- Text baselines now come from one shared font-metric model in both directions, replacing fixed font-size estimates (3d1b7dc, #301).
- Imported text that overflows its frame keeps every line, following DrawingML's default overflow, and stays vertically anchored. Explicit clip and ellipsis are still honoured (c9a8258, d542475).
UI and tooling
- Spec review, confirmation and live preview UIs:
- all detect and store the UI language the same way;
- switching language keeps typed annotations;
- zh-TW uses full-width separators.
Thanks to @kevindesuyo (#305, #306, #307).
- Detached servers keep ANSI colour codes out of their logs (1d76e32). The bundled comparison gallery and logos are smaller (6a9ee2a).
Sponsors
v6.6.0
Minor release from three days of end-to-end runs since v6.5.0: every route was driven through real decks â same-deck hyperlink navigation, Beautify under Quick, Edit Native with pages dropped and with a foreign PPTX used as a template, Create Brand / Layout / Style followed by Generate, four of the bundled Layout templates, the visual-review stage, EPUB and RST sources, a bilingual deck, and decks in Chinese, English, German, Spanish, Portuguese and Vietnamese. Every change below is backed by a reproduced defect or a documented contract gap; no route was added or removed.
Bundled Layout templates
editorial_bleedfades now protect their own text slots. The six text-over-image gradients reached only 0.12â0.35 alpha under the title, caption and body slots they exist to protect (the first visual-review run measured 1.2â2.5:1 contrast on a deck that moved no slot). Each gains a middle stop that holds at least 0.60 through its slot and falls away only past it (012a54f).presentation_core,presentation_core_43andreport_coretable and chart prototypes pass native parity. Each library shipped eight "blocks--native-charts-and-tablesexport" warnings that a deck copying the prototype metadata inherited; the payloads now carry the row heights, header alignment, band-row fills and bold-cell colour their fallbacks draw (7599c78).- A slot's bounds are capacity, not a whitespace quota: the structure interface now says what to do when content under-fills a slot, and that a Morph pair on a structured page is a Slide-local group decided before the first page â stated for template authors, planners and executors alike (b526e82, b431e1b, e1ab666, 9ce704c).
Edit Native PPTX
- Imported text matches what PowerPoint renders.
a:normAutofitfontScale/lnSpcReductionnow reach the emitted font size and line height â a 60 pt box shrunk to 25 % used to import at 80 px and fail the frame gate on any edit â and a run with no typeface anywhere in its chain takes the theme's minor Latin / East Asian pair instead of a baresans-serif, which exported every edited run as Segoe UI (f4ab81f). - The round-trip checker admits an edit that reaches no further than the source text of its own slot, and refuses absolute-
yrows inside a semantic shape, which previously passed the gate and then crashed export (f4ab81f). - Dropping pages from a deck with same-deck links: export lists every slide whose jumps leave the page plan in one pass instead of one per run, prints its receipt only after the package is written, and the workflow documents how to retarget a jump (9290149, 658ebf2).
- New elements may be native-marked charts and tables; the boundary section now says so (29770a2).
Export and checker
--kioskwrites a looping, self-running kiosk show and names the export accordingly (067cb13, 9290149).- Hyperlinks: the checker compares each page's anchors with its
design_spec§IX Hyperlinks line; a bare<a>around one top-level group is transparent for animation and grouping (b7d0114, 48238f9, d4c59f1). - Icon references keep their
filllocal under compact authoring âembed_iconsreads no inherited paint, so the canonical-authoring advisory contradicted the executor's hard rule (aa5cf55). - A stroked rect on a table's outer bounds counts as its frame in the border-topology check; the typed chart/table slot tip now says the standard export fails and names the Slide-local alternative (7599c78).
- Structure-contract errors on a template page now say that fills, strokes and gradients may be repainted â only ids, order, geometry and
data-pptx-*metadata are contract â and a text overflow inside a Layout slot no longer advises expanding the slot's bounds (4a28573, ca15a6a). --template-modereports the roster contract beside a Brand or Style spec in a shared workspace (aa5cf55);beautify_inventory --verifychecks every frozen source string against an exported deck (7e0ea2b);pptx_intakereports grouped shapes in slide space (9e0c246).
Text measurement
- The bundled advance table grows from five families to ten: Cambria, Trebuchet MS, Garamond and Tahoma join Arial, Times New Roman, Georgia, Verdana and Calibri; Segoe UI is measured from Selawik, Microsoft's OFL metric-compatible replacement (d874fb1, 3214e29).
- Accented letters outside the table advance like their base letter. Vietnamese, Turkish, Polish and Czech precomposed letters used to fall into the 0.55 em default tier â
áŧ27 % narrow,áŧ83 % wide (c050b1f). - Unicode fixed-width spaces are sized by definition (70705eb).
Sources, images and tools
web_to_mdvalidates the host the client actually connects to and pins connections to the validated addresses (3b45af2).slice_images --strict-alpharetries once with the measured tolerance when every finding is key noise (d475c0a); several opaque photos for a multi-cell layout may share one generated sheet sliced by grid.import-sourcesremoves a moved duplicate instead of announcing a move that never happened (7599c78);animation_configrefuses a file path where a project directory is expected (df118da);visual_review.py --pagestakes comma lists (012a54f);image_searchkeeps the caller's provider pin (1b57b01).
Workflow and prompts
- Visual review may deepen a fade that already sits under the text, defers a soft hit that recurs deck-wide to one decision by the aggregating agent, and names the parallel-subagent host form (b431e1b).
- Create Template:
standardreads enough Slides to settle direction whilefidelityreads all; a Layout carries one neutral Latin face; a brand manual's usage rules sit under the section they govern; a long PDF reference is sampled by page situation (9ce704c, 5dd4c34). - Quick: template prototypes and the first-page deck language are read from the roster; a book-length source is read by heading index; the installed spec is the re-readable truth for a lockless run (05ad626, adb9faf, e1ab666, 5dd4c34).
- Number, quotation and unit conventions follow each content language; narration reads bilingual notes twice; delegation skips the confirmation page, not the three solution intents (7c4543b, e2aff57, b431e1b).
Examples
Five decks joined the examples site in this cycle, among them the first on the editorial_bleed and story_vertical Layout templates, the first from an EPUB source, and the first with native same-deck hyperlinks.
v6.5.0
Minor release from two focused rounds since v6.4.0: the Create Template / use-template flow was audited and reworked, and the Edit Native PPTX route was exercised on real government and university decks (multi-master, source animations, native charts, SmartArt, narration, revision rounds) and fixed wherever it broke. Every change is backed by a reproduced defect or a documented contract gap; no route was added or removed.
Edit Native PPTX (round-trip import â edit â export)
- Decks that could not be exported at all now export: a built-in layout no slide uses with a collapsed
<a:ext cx="0" cy="0"/>placeholder no longer fails the native structure contract, and an untouched page holding a full-canvas picture no longer loses that picture to background promotion when narration forces a rebuild (6509129). - Motion overlays diff against the import baseline field by field: a sidecar row that omits
transitionkeeps the source transition even though the importer writesdefaults.transition: none;animation.effect: nonereally removes the source timing;-tand effect-only rows keep the sourceadvClick/advTm; a user-edited default is a deck-wide request (a7cb776). - Narration injects into a slide whose timing tree is a bare
tmRoot, blocks on natively preserved click animations with the output stem, source slide and shape ids named, replaces its own earlier audio instead of stacking a second autoplay track, matches imported audio to output pages through the manifest, and reuses its media name across re-recordings (a7cb776, b560f85). - Fidelity: same-deck links on rebuilt objects keep their source destination through text edits, page plans and adoption; Master/Layout refs refuse edits instead of vanishing while the original keeps rendering; ancestor transform / opacity / inherited style join the source-ref diff so a moved wrapper actually moves; a paint-only edit keeps the native text body (auto-numbering, autofit, fields, language); custom-show selections and actions close after a page plan; SmartArt, OLE and other unsupported graphic frames carry the atomic proxy marker the route always promised (57f7623).
- Notes: a new note for one page no longer overwrites another page's notes part; round-trip workspaces match notes by exact stem and print the real count;
--no-notesremoves every notes part, master, relationship and override; imports writenotes/<stem>.mdonly (73bc51a, b560f85). - Packages: replaced chart parts, workbooks and slide relationships the slide XML never used are pruned on edited round-trip pages and on every generated slide (structured export left the promoted master background registered on each slide); the delivery check counts slides, notes, masters and layouts by content type, reports dangling custom-show references as errors and unreferenced slide relationships as advisories (57f7623).
- Quality gate:
svg_quality_checker.py --roundtrip --jsonwrites tovalidation/and shares its fingerprint with the exporter, so a round-trip export can reportquality_gate=passed; the checker measures importedlines/paragraphstext row by row, stops re-estimating source text that only moved vertically, enforces the exporter's one-text semantic-shape contract early, and warns when an edited page rewrites a table the importer could not carry natively (73bc51a, 6509129). - Route documentation states the identity boundary, both imported text models, what skipping
--native-charts-and-tablesreally ships, the notes consumer contract, thespidâshape-<id>mapping, retention of every Master/Layout under a page plan,--primary-language, and a revision-round paragraph (52a2801, 5581c85).
Create Template and template consumption
- Installation is staged with rollback and a machine receipt (
template_install.json); the Confirm UI freezes selected-root snapshots, accepts several explicit roots, binds stages by content and verifies the installation itself â the handoff sidecar and its two commands are gone (6de7939, f58f846). - Type A mirror is a pure tool path: zero-edit import â materialize â checker â preview with a factual spec skeleton; the Type B promise is withdrawn (f58f846).
- Template mode checks carrier baselines against slot bounds, mirror text targets, and offers an advisory
--slot-capacity-report; translucent full-canvas rects are not backgrounds; CJK literal font names never occupy the Latin slot; layout-fixed atoms leave the sparse display-size quota; three bundled deck templates gained taller chapter-number slots (be80892, f58f846). - Structured export keeps custom placeholder faces, re-skins master backgrounds from public pages, compiles typed chart/table slots natively in previews, rejects placeholder slots as Morph endpoints at validate, and compiles zero-padded page numbers to slide-number fields (6de7939, 6e3ce9c).
- Prompts: Stage 1 keeps the goal rather than blacking out template facts; Create Template gains a prototype review round; slot fit is checked before the typography lock; Quick names the typed-slot export flag;
import-sources --no-image-propagationkeeps reference bitmaps out ofimages/(6627d92, f58f846, 6e3ce9c).
Tooling
notes_to_audio.pyaccepts--rate -5%(and--pitch/--volume, now passed to edge-tts) with a space or=(73bc51a).- Test subprocess output decodes as UTF-8 regardless of the parent locale; the first
svg_outputpage is closed deterministically when its root language is read (7879bbc, c6ae489). .env.exampledocuments sponsor relay shortcuts (b44cdfa).
Install
Load skills/ppt-master/ as a skill (the attached ppt-master-skill-v6.5.0.zip contains only that directory) or install the plugin from the repository's marketplace.
v6.4.0
Minor release collecting a week of fixes found by running the pipeline end to end across languages, input types, deck lengths, and a revision round on a delivered deck. Every change is backed by a reproduced defect; no route, gate, or command was added or removed.
Converter (source_to_md.py)
- PDF tables with partial ruling keep the columns drawn outside the ruled box (059119a); spreadsheet notes above the header become a quote instead of a phantom row; a scanned PDF and an out-of-order Arabic text layer are warned about (6c372a2, b3073f8).
- Web fetch keeps the declared charset under a lossy decode and warns when only a sliver of the page body was extracted (95e3c41); web tables keep their links and land on a GFM grid (17d953a, 0ae80b1); document URLs route to their converter and honour
--no-imagesand meta refresh (0b593d6, 25a9984). - DOCX charts, table footnotes, and absolute chart targets survive conversion (22da436, 4bbf7b7); PPTX read-back keeps soft line breaks (c71d9e7).
- Safety: every redirect hop is validated before it is requested, and CGNAT and multicast targets are refused (4bbf7b7).
-oon a single input names the Markdown file and says so;--jsonkeeps stdout to JSON.
Text measurement and multilingual decks
- Width calibration runs per planned script (Thai, Devanagari, Arabic, âĶ) and at bold weight; Indic vowel signs advance the estimator; wrapping keeps words whole in every space-delimited script and breaks Korean between words (8900e87, e64a2b3, 88fb822, 0ae80b1).
- Indic, Thai, Arabic, and Japanese faces are on the PPT-safe list; Japanese decks get EA faces and kinsoku; right-to-left decks get RTL defaults; explicit BCP-47 scripts pick the theme script slot (0609875, 5771f4f).
- Latin runs inside a non-Latin deck proof as English (f76d1ec). Quick decks declare their language on the page root and the export derives theme fonts from the pages (0b06d19).
Native charts and tables
- Table parity compares runs by effective style and lets explicit run colour and weight override the cell default (451c681, aee33e5); parity reads inherited
text-anchorandtspancolour (5771f4f). series[].line_styleis rejected with a clear error and passes only inside a combo; Cambria Math is accepted; JSON CDATA survives compaction; classic axes are refused on ChartEx charts; data-label points follow their show flags (4a7512e, 83d8d00, 25a9984).- Fallback stamping reports a malformed page instead of skipping the valid ones; preset atoms keep their paint through style compaction (7acddfb, 6881d37).
Export and motion
- Morph candidates are planned and authored whether or not animation is enabled (1fb122b); exported objects are named after their SVG id (a849c49); structured decks animate slot groups and re-skin master atoms (529403b).
- MiniMax word timings that share one original-text span merge into one subtitle; written-out numbers stay whole (96742ff, 7086c45).
Quality gate
- The final gate compares the design_spec §IX roster with
svg_output/, so a page dropped or left un-planned during a revision no longer passes silently (191f462). - The carrier receipt counts pages whose §IX Relationships line names a carried relation; the unresolved-geometry warning names the
tspanrule; text picture fills count as image placements (95e3c41, ed17157).
Workflow
- A delivered project's revision has a named entry:
routing.mdsends it to a Revision Round section ingenerate-pptx.md(Default) or a revision note inquick-generate.md(Quick), covering which layer owns each kind of change, what a roster change renumbers, and which commands rerun (77c2745, 4d55172). - User-supplied images with licence terms register in
image_sources.jsonso their credits are bound at the gate; research fetches pass--no-images(8e5e30a). update_spec.pydocs state what a colour change still edits by hand and when to re-stamp fallbacks.
Preview
- Preview URLs open in the Windows browser under WSL (#287, thanks @zhuoyi780-alt).
Install
The ppt-master-skill-v6.4.0.zip asset contains only skills/ppt-master/ for agents that load the skill directory directly.
v6.3.2
Patch release completing the security follow-ups from the v6.3.1 report. Upgrading is recommended for anyone who runs the live preview or Confirm UI, or converts web pages with web_to_md.py.
Security
All five items were reported by Zick Sun as follow-ups to the v6.3.1 fixes and verified before shipping.
- Preview sanitizer hardening (2784f7a).
sanitizeSvg()now keeps only an explicit allowlist of SVG element names in the SVG namespace, closing two residual gaps: null-namespace elements slipped through a short-circuit, and SVG-namespaced elements named like HTML breakout tags (div,iframe) became live HTML afterinnerHTML. Tab, CR, LF, and leading control characters are stripped fromhrefvalues before thejavascript:/vbscript:/data:check, matching what the browser URL parser does. Both gaps were already blocked by the Content-Security-Policy shipped in v6.3.1; that header remains a load-bearing control. - DNS rebinding guard on both local servers (2784f7a). The live preview and Confirm UI servers bind 127.0.0.1 but accepted any
HostorOrigin. Requests now get 403 unlessHostis a loopback name and, when present,Originis too. web_to_md.pyverifies TLS by default (31a20f2). Certificate verification was disabled at every call site. It is now on;--insecureturns it off with a warning for self-signed development hosts.web_to_md.pyrefuses non-public fetch targets (31a20f2). Redirects were followed with no validation, so a page that 302s to a link-local metadata endpoint or private address was fetched and saved. Every requested and final URL, for pages and images, must be http(s) and resolve only to public addresses.--allow-private-hostsopts back in for intranet or localhost pages you chose deliberately.
Other changes since v6.3.1
- Scripts: text width headroom applied per script segment with bounded CJK clause breaks (64b6583); slice_images names edge-wide key noise (ac93240).
- Workflow: Step 6 checkpoint aligned with the P05 early gate (3ad8052).
- Docs: PyMuPDF AGPL-3.0 license and PDF-only scope disclosed (b41ec1d); prompt audit manifest brought to zero findings.
Install
The ppt-master-skill-v6.3.2.zip asset contains only skills/ppt-master/ for agents that load the skill directory directly.
v6.3.1
Patch release. Upgrading is recommended for anyone who opens the live preview (svg_editor/server.py) on projects that contain SVG from third-party sources.
Security
Two issues were reported privately by Zick Sun and fixed in 514596e. Thanks for the clear, verified report. Both require a malicious SVG to already be inside a project directory (for example from a third-party template pack, or a poisoned source document converted by the pipeline). Neither allows reading files outside the project; both servers keep binding to 127.0.0.1 only.
- Live preview sanitizer bypass (mXSS).
sanitizeSvg()in the preview page compared element and attribute names case-sensitively on an XML parse, then inserted the result throughinnerHTML, which lowercases names. UppercaseONERROR=,<SCRIPT>, andXLINK:HREF="javascript:"therefore survived the filter. Comparisons are now case-insensitive, elements outside the SVG/XLink namespaces are dropped,vbscript:is rejected alongsidejavascript:anddata:, and a malformed SVG now shows an error instead of injecting the parser error document. The preview page also gains a Content-Security-Policy restricting scripts to same-origin files. - Icon placeholder attribute injection.
embed_icons.pyinterpolatedfill,stroke,stroke-width, andtransformfrom<use data-icon>placeholders into generated markup without escaping. A single-quoted value containing a bare"could inject a sibling attribute that the CLI then wrote to disk. The four attributes are now validated against strict grammars and every interpolated value is escaped. Legal values, including thematrix()transforms written back by the live editor, are unchanged; a regression run over an existing 50-page project produced byte-identical output.
Other changes since v6.3.0
- Templates: Z-CARE Rescue brand and duty-manual style.
- Video: keep the space between merged subtitle clauses (#283, thanks @MaxFreedomPollard).
- Scripts:
slice_images.pykeeps opaque key-hue foreground intact during pure-key despill. - README: star history chart restored, trending badge added.
Install
The ppt-master-skill-v6.3.1.zip asset contains only skills/ppt-master/ for agents that load the skill directory directly.
v6.3.0
Important
This release is about fidelity and evidence. Native charts and tables now follow the drawn SVG item by item, Latin text is measured from real glyph advances instead of class averages, templates install with one command, and the examples library grew to 33 decks that cover every visual style, mode, and canvas plus the first spreadsheet-, PDF-, and Style-template-driven decks. Create Template and Edit Native PPTX remain paused (bug fixes only).
Converter
- Native charts mirror the fallback drawing. Bar order, point markers and per-point colours, area fills without strokes, clustered gaps and overlap, and where a line starts inside the plot are all read from the authored SVG; sparse cell caches import as gaps; companion text is grouped with its chart so one animation moves the whole unit and sits on the fallback baseline. The chart frame grows past the plot so PowerPoint keeps the manual vertical layout instead of collapsing it.
- Native tables export unfilled cells as
noFill, carrydefaults.runcolour into plain-text cells, letparagraphscells inherit run defaults, and honour authored row heights over padding. - Text width from real glyphs. Arial, Times New Roman, Georgia, Verdana, and Calibri (regular, bold, italic, bold-italic) are measured from a bundled per-glyph advance table (
font_advances.json); monospaced faces measure as characters à fixed advance; wide faces (Arial Black) keep their factor. A mixed-case Arial line can now fill about 94% of its text frame before the wrap headroom applies, up from 85%, and the checker and the exporter agree on the same number on every machine. - Export correctness fixes: hidden SVG elements and hidden clip shapes stay hidden, hidden groups keep their animation target, single-child group rotation is preserved, inline
tspan dxis carried, root and native-gradient opacity apply, out-of-range shape frames and incomplete pattern fills are rejected instead of producing a file PowerPoint repairs, zero-width strokes export as no line, camera MPO JPEGs keep their primary frame, and image tools honour EXIF orientation.
Source conversion
- Excel values keep full precision, source encodings are detected, inline spacing and absolute links survive web pages, HTML comments are dropped, raw Markdown and plain-text URLs are saved verbatim,
pdf_to_mdkeeps line-leading decimals,--no-imagesworks for web pages, an extension-less-obecomes<name>.md, batch conversion never overwrites an input, andimport-sourcescopies another project's files instead of moving them. - The source converter's
--helpno longer needs optional dependencies installed (#282).
Templates
apply_template.pyinstalls selected Brand / Style / Layout / Deck workspaces into a project per the apply-template-workspace runbook: validation, library/explicit provenance, Layout over Deck, roster and asset copy, idempotent re-runs, and a §5.3 receipt.mbb-consulting, a new Style for strategy documents at document density â numbered exhibits with unit lines, a key-message column closing in an implication panel, five to seven modules per page, fixed page chrome, size anchors, fallback colours and typography â distilled from the EV market-priorities example.consulting-decisionkeeps its restrained method-first defaults.
Checker and authoring tools
- Chart/table parity findings that would break
--native-charts-and-tablesare tagged as export-blocking; parity honoursnumber_format, exact ticks,style.body_textfor first columns, the centred header default, and names the multi-column rect behind a whole-column fill. text_measure.py calibrateprints CAPS and DIGITS rates, an outline column, and merges--role; the width check reads inline hyperlink runs;validateresolves the real project directory;initresolves the projects root from the skill and checks the page count against the roster.- Animation order: unlisted groups follow the nearest listed order instead of their SVG index; static-role chrome animates when the sidecar names it, only structural layers and the slide background stay fixed;
list-groupsnames chrome ids. - Slice diagnostics tell drift from overflow, keep the pure key, and flag backing panels; image search pages through a saved candidate pool;
rotate_imagesreports failures. - A Tencent Cloud TokenHub image backend (
tencent, aliasestokenhub/hunyuan) joins the image generators (#279).
Prompts and rules
- Animation guidance: chrome is static by default and animates per page when named; Morph endpoints are groups fixed at first draw, continuity carriers are the default Morph; entrance order follows the reading path; illustration roles decide what moves.
- Text and layout guidance: bounds top and bottom edges are spelled out, role groups still declare bounds, the all-tspan first line carries inline emphasis, digits use the DIGITS rate, calibration rates are sample averages with a 5% margin, and repeated writing forms are treated as method-level at the early gate.
- Native data:
data_labelstype support, native objects never Morph-pair,row_heightsincludes the header row,borders.styleform,defaults.cell, and the full chrome token list are documented where the exporter reads them. docs/rules/code-style.md§11 now allows unit tests underskills/ppt-master/scripts/tests/on stated conditions (stdlib unittest, scripts only, in-test fixtures, no CI); the suite has 212 tests.
Examples
The examples site now holds 33 decks (471 pages), with the first decks driven by a spreadsheet source (Apple FY2025 operating review from XLSX + CSV), by a PDF source (the ResearchStudio-Reel paper reading, English, academic-research Style), and by bundled Style templates (Cloudflare outage postmortem, uv product launch, EV market priorities on mbb-consulting), alongside new photo-, data-, and illustration-led decks (Apollo photo essay, China 2025 economy briefing, pixel-art breakfast atlas, solar-terms long-form and story, tea A4 handout, heritage-goods moments grid, brutalist field guide, WebGPU Quick, banner and header sets). Six May-era examples were migrated to the current checker without regenerating them.
Community
- #278 (@WodenJay): wrapped Python daemon processes are verified on startup.
- #282 (@QiuLsG): source converter help stays dependency-free.
- #279: Tencent Cloud TokenHub backend.
Assets: ppt-master-skill-v6.3.0.zip is the skill-only tree for loading skills/ppt-master/ into any agent tool; the source archive carries the full repository.