Model or dataset
sligter/LandPPT avatar
sligter/LandPPT

LandPPT: an LLM presentation platform that generates HTML slides and exports them

一个基于LLM的演示文稿生成平台,能够自动将文档内容转换为专业的PPT演示文稿。平台支持多种AI模型,提供丰富的模板和样式选择,让用户能够创建高质量的演示文稿。

3,611 stars482 forksPythonNOASSERTION

At a glance

What is it?
LandPPT turns a topic or an uploaded document into an editable HTML deck, with optional research, narration and multi-format export. It is a self-hosted Python service, and the editable PPTX path runs through a commercial Apryse licence.
Who is it for?
Adopt LandPPT if you already pay for an LLM API, want the pipeline on your own server, and can live with HTML slides as the source of truth. Skip it if you need native PowerPoint editing without buying an Apryse key, or if you want a managed SaaS with no Postgres and Valkey to operate.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 9 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 28, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What LandPPT actually replaces in a deck-building workflow

The project describes itself as a platform that takes a topic description or an uploaded document (PDF, Word, Markdown, Excel, PowerPoint) and produces a presentation. The README frames the pipeline as five stages: outline, layout, images, speaker notes, export. That is a specific claim about scope. LandPPT is not a slide editor that happens to have an AI button; the AI step is the entry point, and the editor exists to fix what the model produced.

The audience is narrower than "anyone who makes slides". You need at least one AI provider key before the basic outline and HTML slide generation work at all. The dependency table in the README is explicit that this is required, not optional. If you have no key and no local Ollama instance, the install will start and the generation will not. Everything else (deep research via Tavily or SearXNG, network and AI images, narration video, editable PPTX) sits behind additional keys, flags or binaries.

So the realistic user is a developer or a small team that already has API credit with OpenAI, Anthropic, Google, Azure OpenAI, or an OpenAI-compatible endpoint such as DeepSeek, Moonshot or Qwen, and wants the generation loop on infrastructure they control.

The generation pipeline: outline, parallel HTML slides, then export

LandPPT generates HTML slides, not PPTX, as its working format. The README's one-line summary reads "topic / document → outline → HTML PPT → script / narration / export". That ordering matters. The model writes an editable outline first, then slides are produced in parallel from that outline, and export is a later, separate step. Editing happens in the browser against the HTML, with a sidebar AI chat for revisions and image swaps.

The provider layer is role-based. The environment example lists separate provider and model variables for outline, creative, image prompt, slide generation, editor assistant, template generation and polish. You can point outline at a cheap model and slide generation at an expensive one. That is a cost-control mechanism, and it is the most interesting design decision in the configuration surface.

Deep research is optional and plugs in Tavily or SearXNG to pull and summarise current web information before the outline is written. Image sourcing is three-way: a local library, network libraries (Pixabay, Unsplash), or generated images (DALL·E, SiliconFlow, Pollinations, OpenAI, Gemini). The image service is off by default and turns on with ENABLE_IMAGE_SERVICE.

Export is where the architecture gets a sharp edge. The dependency table separates "standard editable PPTX", which requires APRYSE_LICENSE_KEY, from image-based PPTX, which needs no Apryse and produces high-fidelity slides whose in-page elements are normally not re-editable. PDF, HTML, images, DOCX and Markdown exports do not carry that constraint.

Installing LandPPT with uv and generating a first deck

The README lists five install paths. The recommended local one uses uv. After cloning, you sync dependencies, copy the environment template, and edit it to add at least one AI key. The .env.example ships with placeholder keys such as OPENAI_API_KEY=your_openai_api_key_here, so the file will start but generation will fail until you replace one.

bash
git clone https://github.com/sligter/LandPPT.git
cd LandPPT
uv sync --extra dev
cp .env.example .env
uv run python run.py

With no DATABASE_URL set, the service uses SQLite and an in-memory cache, which is why the README calls this the one-command trial path. The default port is 8000.

Once it is up, three endpoints matter. The web interface is at http://localhost:8000, the API documentation at http://localhost:8000/docs, and a health check at http://localhost:8000/health. In local and development environments an administrator is often initialised automatically as admin / admin123, controlled by the LANDPPT_BOOTSTRAP_ADMIN_* variables. The README states plainly that production deployments should change that password or disable auto-initialisation.

For a production-shaped deployment, the compose file starts the web app, a worker, PostgreSQL, Valkey and MinIO, with minio-init creating the bucket. The compose environment sets DATABASE_URL to a postgresql:// URL, CACHE_BACKEND to valkey, and TASK_EXECUTION_MODE to queue, which is what moves PDF, PPTX and narration-video work off the request path.

bash
cp .env.example .env
docker compose up -d
docker compose logs -f landppt

The README notes that the production compose defaults to LANDPPT_BOOTSTRAP_ADMIN_ENABLED=false, and that a first deployment should set it to true with explicit credentials, then presumably turn it back off.

Where LandPPT breaks down or is the wrong tool

The editable PPTX export is the clearest limitation, and it is a licensing one rather than a technical one. Without APRYSE_LICENSE_KEY you get image-based PPTX: each slide is a picture, so nobody downstream can move a text box or restyle a chart. If your deliverable is a deck a colleague must edit in PowerPoint, LandPPT without the Apryse key is the wrong tool. The README does not describe a workaround, and it does not document rollback for a failed export job.

Database migrations are another sharp edge. Startup runs migrations automatically, and LANDPPT_AUTO_MIGRATE_ON_STARTUP can turn that off. The README warns that when multiple nodes share one database, automatic migration should be disabled and run as a separate one-off job. The compose file exposes LANDPPT_AUTO_MIGRATE_LOCK_TIMEOUT_SECONDS and LANDPPT_AUTO_MIGRATE_LOCK_STALE_SECONDS, which implies a lock-based scheme, but the README does not explain the failure behaviour when a lock goes stale beyond the timeout values.

Narration video needs ffmpeg on the host, and the README lists it under system requirements rather than as an optional extra. The image service is off by default, so a first-time user who expects generated illustrations will see none until ENABLE_IMAGE_SERVICE is set and an image provider key exists.

Finally, the licence metadata is inconsistent. The README badge and pyproject.toml both say Apache-2.0, while the repository's licence field reports NOASSERTION. Anyone who needs a clean licence answer before adopting should read the LICENSE file directly rather than trusting either signal.

LandPPT versus Gamma and other hosted deck generators

The obvious comparison is a hosted generator such as Gamma, or the many browser tools that turn a prompt into slides. The difference is not output quality; it is where the pipeline runs and what you can change inside it. Hosted tools own the model choice, the template library and the data path. LandPPT lets you route outline, slide generation, image prompts and polish to different providers, including a local Ollama model, and keeps documents, research reports and generated artifacts on your own volumes.

The trade is operational. A hosted tool asks for a login. LandPPT asks for PostgreSQL, Valkey, MinIO and a worker process once you leave the SQLite trial path, plus a reverse proxy and a real SECRET_KEY. The compose file also defaults SECRET_KEY to "your-secret-key-change-me", which is a placeholder you must replace.

A second alternative is the plain "ask a chatbot for Markdown, paste into PowerPoint" route. That is free of infrastructure and produces no HTML intermediate. LandPPT's advantage is the pipeline around the model: parallel slide generation, an editable outline you can rerun per stage, a template extracted from an uploaded reference PPTX, and export to six formats. Its disadvantage is that the editable-artifact problem is only solved if you pay Apryse. If you do not care about editing slides afterwards, the chatbot route is simpler and cheaper.

Maintenance, upgrades and what the licence signals say

The repository is not archived, and the last push was on 2026-09-09. Releases are spaced roughly one to two months apart: v0.3.0 on 2026-04-13, v0.3.1 on 2026-05-15, v0.3.2 on 2026-07-09. That cadence suggests ongoing work, though the README does not describe a support policy or a deprecation window.

Upgrade cost is dominated by the database layer. Alembic is a declared dependency and migrations run on startup by default, so a version bump can change schema on first boot. In a multi-node deployment that is exactly the case the README tells you to handle manually: set LANDPPT_AUTO_MIGRATE_ON_STARTUP=false and run migrations as a separate job. There is a helm/ directory in the repository layout, which implies Kubernetes deployments are anticipated, but the README does not document the chart.

On licensing, the README badge and pyproject.toml both declare Apache-2.0, while the repository licence field reports NOASSERTION. Apache-2.0 is permissive and generally compatible with commercial self-hosting, but the Apryse dependency is separate and commercial: the README calls APRYSE_LICENSE_KEY a commercial licence and marks it as required for standard editable PPTX export. That is a second licence obligation sitting on top of the project's own. This is not legal advice; check the LICENSE file and Apryse's terms against your own distribution model.

Editorial conclusion

Adopt LandPPT if you already pay for an LLM API, want the pipeline on your own server, and can live with HTML slides as the source of truth. Skip it if you need native PowerPoint editing without buying an Apryse key, or if you want a managed SaaS with no Postgres and Valkey to operate. Before committing, verify three things: that your chosen provider key works for the outline and slide roles you configured, that ffmpeg is present on the host if you want narration video, and that LANDPPT_BOOTSTRAP_ADMIN_ENABLED is false on anything reachable from the internet.

Frequently asked questions

Can I make PPT for free with LandPPT?

The software itself is free to run, and the local SQLite path needs no database or cache server. However, basic outline and HTML slide generation requires at least one AI provider key, and editable PPTX export requires a commercial APRYSE_LICENSE_KEY. Image-based PPTX export needs no Apryse key.

Which AI can make a PPTx with LandPPT?

LandPPT supports OpenAI GPT, Anthropic Claude, Google Gemini and Azure OpenAI, plus OpenAI-compatible endpoints such as DeepSeek, Moonshot and Qwen, and local models through Ollama. The README says models can be routed per role, for example a different model for the outline and for slide generation.

What is a PPT used for in the context of LandPPT?

LandPPT treats the deck as the final deliverable of a pipeline that starts from a topic or an uploaded document and passes through outline, HTML slides, speaker notes and export. It can also generate narration audio and a 1080p explanation video from the speaker notes.

Official sources

  1. Issues
  2. Project website
  3. README
  4. Releases
  5. sligter/LandPPT on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/sligter-landppt.svg)](https://hysenlabs.com/projects/sligter-landppt)