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
Before building, /build asks how the deck should look:
- Default theme — the one set in
hebrewPptx.defaultTheme.
- Describe the styling — in your own words; it shapes tone and density.
- Match a reference image — pick a screenshot, logo or brand slide and the
palette is taken from it. The accent comes from the image; background and
text colours are pinned to whatever stays readable, so a busy reference still
produces a legible deck. The image is also shown to the model, when the model
accepts images, so it can match how formal and how dense the slides are.
The question is skipped when your prompt already mentions styling ("in dark
theme", "בעיצוב המותג"). Turn it off entirely with hebrewPptx.askForStyling.
Without a slash command it answers questions about Hebrew and RTL decks using
the skill's own documentation.
What the model decides, and what it does not
The slide content is written by whichever language model you have selected
in Copilot Chat — this extension does not write Hebrew. So the wording, the
structure, how well the Hebrew reads, and whether anything is invented all
depend on the model you pick. A stronger model gives better decks; a weaker or
faster one gives thinner content, clumsier Hebrew, and a greater tendency to
pad a slide with numbers nobody supplied.
What does not depend on the model, because it is enforced by the skill's
Python rather than generated:
- right-to-left direction, right alignment, mirrored bullets and table columns
- the bidi fixes for
+18%, .NET, C# and friends
- the complex-script font on every Hebrew run
- palette contrast when matching a reference image
- the
validate_rtl.py check that the shipped file is genuinely RTL
In other words the deck is always correctly Hebrew; whether it is any
good is down to the model.
Two practical consequences:
- Read the deck before presenting it.
validate_rtl.py verifies structure,
not truth. It cannot tell you a figure is wrong, only that it renders on the
correct side. Give the model your real numbers rather than asking it to
supply them — the spec prompt tells it to invent none, but that is an
instruction, not a guarantee.
- Reference images need a vision-capable model. The palette is extracted
locally and always works, but the image is only shown to the model if the
selected model accepts images. If it does not, the extension falls back to
text-only and the reference influences colours but not slide density.
Switch models with the picker at the bottom of the Copilot Chat input.
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