Image to PPTX gains OCR text evidence, text-removed bases, and checked image layers, and now runs on any vision host with an image_gen.py reference-image backend. Narration adds an OpenAI Realtime provider, image_gen.py can produce animated GIFs on OpenAI gpt-image-2.6, and a round of conversion and round-trip fixes stops sources from being overwritten or silently altered.
Image to PPTX
- New
scripts/image_ocr.py:scanOCRs normalized page images into reviewable text blocks (line boxes, estimated font size, sampled ink color), and the text layer becomes native text over a text-removed base. Removal results are composited back onto source pixels, and merged bases are checked for text left inside removal boxes (37efd01, e55a56f, 574265a, d1619e4). - New
scripts/image_layers.py:checkverifies an extracted layer is registered against the page,diff-mattederives a layer from the page's own pixels,mono-mattecuts a single-color graphic (such as a white logo) cleanly from a key plate, and merges are layer-aware and honour occlusion (bbc8444, 3c5cd65, 4a68cdd, 79d7cf5). - The profile is no longer tied to one host: any vision host with a reference-image path works, either host-native editing or
image_gen.py --reference-image(OpenAI, Gemini). Every page follows one assembly path; text removal defaults to-b openaiand registered layers to-b gemini, with at most two residue retries before a page is marked for manual work (9577d60, 09547b1, 7387d7b, 6b0a2a5, 8e80951).
AI image generation
image_gen.py --gif-frames N [--gif-frame-ms MS]returns an animated GIF from OpenAIgpt-image-2.6-*, for new images or to animate an existing one with--reference-image. Frame sizes are fitted to the server's sprite-sheet grids, which were measured on every frame count (db3bfc1).gpt-image-2.6-*models get the same size and quality handling as the 2.5 family (7c0eb65).- Each image is written once in its filename's format: a
.jpgitem keeps Gemini's JPEG bytes unchanged instead of a PNG round trip, and no orphan.pngis left behind (8fe777a). - In manifest runs, rate limits go straight to the runner, which halves concurrency and honours
Retry-Afteron the first 429 instead of after four backend retries. Successes are persisted from the worker thread, and each completion line reports the delivered pixels (9828c10, 54385b1, 650b583, 946241c). - Sheet slicing respects sheets that carry their own transparency, source sheets are protected from being overwritten, and 16-bit grayscale images convert correctly (8db9dc5, 75e1fbf, ce27cae).
- New AI Image Generation page records measured cost, size limits, text rendering, editing, and GIF behavior of the OpenAI and Gemini models (a99224b).
Narration
notes_to_audio.py --provider openaiusesgpt-realtime-2.1-miniover the Realtime WebSocket (the replacement OpenAI names fortts-1andgpt-4o-mini-tts, which retire on 2027-01-06). Each page confirms the effective session config before accepting audio. Recording-based custom voices work with--voice-id voice_...(ec4ca8b, c67ca5f, 4c449a1, 82468e8).
Edit Native PPTX round trip
- An export
-othat points at the source or originally imported PPTX is refused before anything is written; previously it replaced the source, and later exports failed the source fingerprint (1d31b9e). - Edited native objects stay faithful on export (9b05035).
Source conversion (source_to_md)
- Output paths that resolve or hardlink to an input are refused, so a pre-existing alias can no longer overwrite a source DOCX/XLSX; same-title web pages in one batch get distinct files (087cb94).
- PDF: soft masks, rotated table text, and table cell order are kept; header and footer bands are classified in displayed page coordinates (7d1fdd7, 719786f, 545e7fe).
- DOCX and Pandoc: resource links, imports, and text stay faithful, and Pandoc includes resolve from the source with their media (21437a5, 1123e72). Charts keep their category context and literal Office text (fc627fe).
Templates, icons, and the live preview editor
- Re-installing a template replaces its
Installed-fromline instead of stacking another (edc204a). - Each embedded icon instance gets its own internal IDs, so repeated icons no longer collide (1d35572).
- The SVG editor keeps typed keys in form fields, shows raster data-URI images, and verifies that a running server is its own before reusing or stopping it (afad284, afbfcd1).