Open-source PPT/PPTX preflight checks for AI-generated PowerPoint files.
Project description
PPTLint
Do not send the PowerPoint yet. Problems that stay invisible on your laptop often appear on your client's computer or in the meeting room.
简体中文 · Product site · 12 before/after cases · Current 83 → 100 proof
Not “is it beautiful?” — “is it safe to send?”
A deck can look finished and still fail at handoff:
- a substituted font wraps the title and clips the final line;
- two text boxes overlap only on another computer;
- the entire slide is one image, so a recipient cannot edit one number;
- notes, hidden slides, comments, author data, or local file links leave with the deck;
- a missing package part triggers a PowerPoint repair warning;
- duplicated media turns nine slides into an 86 MB file.
PPTLint runs locally, reads the .pptx, and writes offline HTML and JSON reports. It does not upload the deck, call a model, modify the source, or collect telemetry.
Start in one minute
Give this to Codex, Claude Code, or another coding agent:
Install PPTLint and check whether this PowerPoint is ready to send to a client.
Separate must-fix items from human-review suggestions, name the affected slides,
and give me the exact PowerPoint steps. Do not modify the source file.
Or run it directly:
uvx pptlint check output.pptx --scenario present
present is the default meeting-room scenario. Use screen for close screen reading or document for report-like decks.
Each run writes:
pptlint-report.html— an offline human report that explains consequences and next steps;pptlint-report.json— stable evidence for agents, CI, and integrations.
Inspect the evidence first
- 12 delivery-risk before/after cases;
- real editable deck: 83 → 100, with both PPTX files and full reports;
- before PPTX and after PPTX;
- evaluation-method archive.
In the published nine-slide Proof Loop, 103 items are no longer reported, 21 still need review, three new low-confidence reminders appear, and no new high-confidence problem appears. A score of 100 is a scoring result, not an aesthetic grade or a zero-risk guarantee.
Three outcomes people can act on
| Result | What to do |
|---|---|
| Ready to send | No high-confidence delivery problem was found; still perform the final human preview |
| Check before sending | Open the named slides and confirm suggestions that need context or human judgment |
| Fix before sending | Resolve the listed blocker, save a separate delivery copy, and check again |
Repeated object-level findings are grouped in HTML so 200 instances of one root cause do not become 200 noisy tasks. Full evidence remains in JSON.
Prove the edit
Keep the original and edit a separate copy:
uvx pptlint proof before.pptx after.pptx \
--scenario present --output comparison
The proof pack separates resolved, remaining, and newly introduced findings.
Create a repair brief for a coding agent:
uvx pptlint plan pptlint-report.json --output repair-brief.md
The brief tells the agent to preserve the source and not damage an existing design merely to raise a score.
Team delivery policy
uvx pptlint policy init pptlint-policy.yml
uvx pptlint check output.pptx --policy pptlint-policy.yml
Policies can define approved fonts and colors, minimum type size, and rules for external links, notes, hidden slides, and alt text. Unknown policy fields fail explicitly instead of being ignored.
Scope and boundaries
| Delivery question | What PPTLint checks |
|---|---|
| Will the file open? | PPTX package structure, relationships, content types, media, slide list, and real rendering |
| Will people see it? | Off-canvas text, substantial overlap, clipping risk, type size, contrast, and aspect ratio |
| Will it survive another computer? | Fonts, external files, motion, transitions, audio, video, and notes relationships |
| Can someone edit it? | Native text, tables, charts, shapes, and full-slide image coverage |
| Is it safe to send? | Notes, comments, hidden slides, author data, local files, and external links |
| Is handoff practical? | Package size, duplicated media, embedded fonts, and dynamic-content facts |
PPTLint does not judge aesthetics, persuasion, or factual accuracy. Low-confidence hints never block delivery. Need to create or repair the deck first? Use Ultimate PPT Master, then run PPTLint as the independent check.
GitHub Actions
- uses: kdnsna/pptlint@v0
with:
path: output.pptx
profile: ai-generated
renderer: wireframe
Reports are uploaded even when the check fails.
Stable interfaces and development
- Current report:
pptlint-report/v2 - Previous report:
decklint-report/v1 - Comparison:
decklint-comparison/v1 - Exit code
0: completed;1: changes required;2: file or runtime error.
uv venv --python 3.13
uv pip install -e '.[dev]'
PYTHONPATH=src .venv/bin/python -m pytest
.venv/bin/ruff check src tests tools
decklint remains as a compatibility alias. All new documentation and commands use pptlint.
MIT · Local · Read-only · No upload · No model · No telemetry
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pptlint-0.7.1.tar.gz.
File metadata
- Download URL: pptlint-0.7.1.tar.gz
- Upload date:
- Size: 3.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27a94b7dc748adc23f97bc9cf8ee954d2abe0c3732140254afb6aabdae0b4e25
|
|
| MD5 |
7e96c4c5db4c33858d8e5cfceb322825
|
|
| BLAKE2b-256 |
b54d6717456f0698fb77fadc1eea920f771be8b15dd45d0ac908091e40f69310
|
Provenance
The following attestation bundles were made for pptlint-0.7.1.tar.gz:
Publisher:
publish-pypi.yml on kdnsna/pptlint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pptlint-0.7.1.tar.gz -
Subject digest:
27a94b7dc748adc23f97bc9cf8ee954d2abe0c3732140254afb6aabdae0b4e25 - Sigstore transparency entry: 2152288688
- Sigstore integration time:
-
Permalink:
kdnsna/pptlint@d9cff3e666ed69a368b07d84688b72d31ba1619e -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/kdnsna
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@d9cff3e666ed69a368b07d84688b72d31ba1619e -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file pptlint-0.7.1-py3-none-any.whl.
File metadata
- Download URL: pptlint-0.7.1-py3-none-any.whl
- Upload date:
- Size: 57.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
350beb4071733797d0cd3db39c627cf2bca3385dd4b31f820fdb5a6558d66957
|
|
| MD5 |
dc18656d2cbad7039f2aa67486d7d181
|
|
| BLAKE2b-256 |
f33c8bc46f3a15390a962582a403825ffc7f97e75e974a105da6a9c535c1f0c2
|
Provenance
The following attestation bundles were made for pptlint-0.7.1-py3-none-any.whl:
Publisher:
publish-pypi.yml on kdnsna/pptlint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pptlint-0.7.1-py3-none-any.whl -
Subject digest:
350beb4071733797d0cd3db39c627cf2bca3385dd4b31f820fdb5a6558d66957 - Sigstore transparency entry: 2152288707
- Sigstore integration time:
-
Permalink:
kdnsna/pptlint@d9cff3e666ed69a368b07d84688b72d31ba1619e -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/kdnsna
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@d9cff3e666ed69a368b07d84688b72d31ba1619e -
Trigger Event:
workflow_dispatch
-
Statement type: