RTL PowerPoint Generator
Build Hebrew and right-to-left PowerPoint decks from GitHub Copilot Chat.
python-pptx cannot produce a correct RTL deck on its own — it has no API for
the paragraph rtl attribute, the complex-script font, or the
presentation-level RTL flag. This extension ships a skill that supplies all of
them, installs it into your workspace so Copilot can find it, and removes it
again when the extension goes away.
Getting started
There are two ways in, and the agent is the one you have to pick deliberately.
1. Select the agent (recommended)
Open Copilot Chat and choose RTL PowerPoint Generator from the agent
dropdown — the picker at the bottom-left of the chat input, next to the model
selector, that normally reads Agent or Ask. Selecting it is what loads the
RTL rules; if you leave the default agent selected, Copilot answers as usual
and may hand-roll python-pptx, which produces a deck with the text on the wrong
side.
Once selected, just describe the deck:
סקירה רבעונית לצוות הפיתוח, 8 שקפים
The agent stays selected for the rest of the conversation. Switch back to the
default agent the same way.
If it is not in the dropdown, see Troubleshooting.
2. Use the chat participant
@hebrew-deck works from any agent without switching — type it at the start of
your message. It runs the build itself using the extension's own interpreter
discovery, so it is the more reliable of the two.
Chat
@hebrew-deck in Copilot Chat:
|
|
/build |
Describe a deck; get a spec, a built .pptx, and a validation report |
/spec |
Draft the JSON spec without building |
/validate |
Check that a .pptx is genuinely right-to-left |
/setup |
Check Python and python-pptx are ready |
@hebrew-deck /build סקירה רבעונית לצוות הפיתוח, 8 שקפים
Styling and brand assets
Every /build starts by asking which brand assets you have. Select any
combination, or press Esc for none:
|
|
| Brand template |
A .pptx/.potx. The deck inherits its masters, layouts, fonts, colours and slide size — a 4:3 corporate template produces a 4:3 deck |
| Background image |
Full-bleed behind every slide |
| Logo |
Top-left on every slide, the one corner that cannot collide with a right-aligned RTL heading |
| Reference image for colours |
Palette sampled from a screenshot, brand slide or artwork |
| Written style guidelines |
Tone and density, in your own words |
It asks every time, deliberately. An earlier version skipped the question when
your prompt mentioned styling, but "in dark theme" says nothing about whether
there is a corporate template or a logo that belongs on every slide — and a
deck that ignores those has to be built again from scratch. Turn it off with
hebrewPptx.askForStyling.
Section dividers keep their flat accent colour rather than the background
image: a photo behind one buries the text it exists to carry. A missing asset
file fails the build instead of being silently dropped.
Colours from a reference image are sampled, but background and text are pinned
to whatever keeps text readable — a deck that matches the reference and cannot
be read is worthless.
Commands
All under RTL PowerPoint in the palette: New Deck Spec, Build Deck from Spec, Validate Presentation, Check Python Setup, Open
Skill Documentation. Build and Validate also appear on the right-click menu for
.json and .pptx files.
Requirements
Python 3.9+ with python-pptx:
python3 -m pip install python-pptx # macOS / Linux
py -3 -m pip install python-pptx # Windows
The extension finds interpreters by absolute path as well as by name — a
VS Code launched from Finder or the Dock does not inherit your shell's PATH, so
a bare python3 there is often Apple's /usr/bin/python3, which has no
third-party packages. Homebrew, /usr/local/bin, python.org framework builds,
pyenv and the Python extension's selected interpreter are all checked. On
Windows py -3 is preferred, because a bare python3 hits an app-execution
alias that opens the Microsoft Store.
If it still cannot find yours, set hebrewPptx.pythonPath to the full path.
RTL PowerPoint: Check Python Setup lists everything that was tried.
PowerPoint itself is not required to generate or validate decks.
Where the skill lives
Nowhere on your disk. The skill and the agent ship inside the extension and
are registered declaratively through contributes.chatSkills and
contributes.chatAgents. VS Code hands the model the skill's absolute path when
it loads it.
That means:
- Your repositories are never touched. No
.github/skills/, no
.github/prompts/, and copilot-instructions.md is never written or
appended to.
- Uninstalling is clean by construction. The registration disappears with
the extension; there is nothing left to delete. Earlier versions relied on the
vscode:uninstall hook, which VS Code declares in its package.json schema but
no runtime code actually reads or spawns — so uninstall genuinely left
files behind.
- You are always on the current version. A copy written into a workspace or
a user folder would be discovered at a higher priority than the shipped one
and would silently override it, pinning you to whatever version wrote it.
Trade-off: because nothing is written to ~/.copilot/skills, the skill is
visible to VS Code only — not to Copilot CLI or Claude Code.
Upgrading from 1.0.0
1.0.0 wrote the skill into every workspace it saw. On first run 2.0.0 removes
those copies, using the install manifest as proof of authorship, and tells you
what it removed. A repository that committed its own copy has no manifest
entry and is never touched — but it will override the shipped skill, so
/setup warns when it sees one. RTL PowerPoint: Clean Up Files from Earlier
Versions… removes it after a modal confirmation.
Requires chat.useAgentSkills
If that setting is off, VS Code loads no agent skills at all, including
contributed ones. /setup reports it.
Troubleshooting
"RTL PowerPoint Generator" is not in the agent dropdown. Reload the window
first (Developer: Reload Window) — a newly installed extension's
contributions do not appear until the window reloads. Then run RTL
PowerPoint: Check Python Setup, which asks VS Code what it actually
registered and prints the resolved paths.
Copilot ignores the RTL rules. Check the agent dropdown actually says RTL
PowerPoint Generator. Selecting a different agent, or the default one, does
not load the skill.
The deck builds but Hebrew renders left-aligned. A copy of the skill left
in your workspace by version 1.0.0 overrides the one shipped with the
extension, so you are running old scripts. /setup warns when it sees one;
RTL PowerPoint: Clean Up Files from Earlier Versions… removes it.
Settings## Settings
| Setting |
Default |
|
hebrewPptx.deckFolder |
"" |
Where decks go when no folder is open |
hebrewPptx.pythonPath |
"" |
Interpreter override |
hebrewPptx.askForStyling |
true |
Ask about styling before building |
hebrewPptx.defaultTheme |
navy |
light, dark, navy, warm |
hebrewPptx.deckOutputFolder |
out |
Where .pptx files land |
Building from source
cd extension
npm install
npm run compile # syncs the skill from the repo, then compiles
npx @vscode/vsce package --no-dependencies
The skill has one source of truth: .github/skills/hebrew-rtl-pptx/ at the
repository root. npm run compile copies it into assets/, so the extension
payload cannot drift from the skill the repo tests.
License
MIT