mirror of
https://github.com/sligter/LandPPT.git
synced 2026-08-28 23:31:06 +08:00
495 lines
16 KiB
Markdown
495 lines
16 KiB
Markdown
# LandPPT - AI-Powered PPT Generation Platform
|
|
|
|
[](https://github.com/sligter/LandPPT/stargazers)
|
|
[](https://github.com/sligter/LandPPT/network)
|
|
[](https://github.com/sligter/LandPPT/issues)
|
|
[](LICENSE)
|
|
[](https://www.python.org)
|
|
[](https://fastapi.tiangolo.com)
|
|
[](https://hub.docker.com/r/bradleylzh/landppt)
|
|
[](https://deepwiki.com/sligter/LandPPT)
|
|
|
|
**English** | [中文](README.md)
|
|
|
|
<div align="center">
|
|
<img src="https://img.pub/p/e810c5680509b4f051a5.png" width="160" alt="LandPPT Logo" />
|
|
<p><b>Topic / Document → Outline → HTML PPT → Script / Narration / Export</b></p>
|
|
</div>
|
|
|
|
**In one line:** LandPPT is an LLM-powered presentation platform—turn a topic or uploaded document into an editable professional deck, with speech scripts, narrated video, and multi-format export.
|
|
|
|
**Core capabilities:**
|
|
|
|
| Capability | Description |
|
|
|------------|-------------|
|
|
| One-click generation | Topic to full PPT, with parallel slide generation |
|
|
| Smart images | Local gallery / web stock / AI generation |
|
|
| Deep research | Tavily + SearXNG for live web retrieval and summaries |
|
|
| Scripts & video | Speech scripts + Edge-TTS per-slide narration; 1080p video export |
|
|
| Multi-format export | PDF / HTML / PPTX / images / DOCX / Markdown |
|
|
| Automation | OpenAI-compatible API + REST APIs with API-key auth |
|
|
|
|
[Documentation](http://landppt-doc.52yyds.top/docs) · [Docker Hub](https://hub.docker.com/r/bradleylzh/landppt) · [Issues](https://github.com/sligter/LandPPT/issues)
|
|
|
|
---
|
|
|
|
## Table of Contents
|
|
|
|
- [Overview](#overview)
|
|
- [Features](#features)
|
|
- [Screenshots](#screenshots)
|
|
- [Dependencies & Scope](#dependencies--scope)
|
|
- [Quick Start](#quick-start)
|
|
- [Usage Guide](#usage-guide)
|
|
- [Configuration](#configuration)
|
|
- [FAQ](#faq)
|
|
- [Contributing](#contributing)
|
|
- [License](#license)
|
|
- [Contact](#contact)
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
LandPPT folds outline writing, layout, imagery, speaker notes, and export into one AI workflow:
|
|
|
|
1. **Input** — topic text, or PDF / Word / Markdown / Excel / PPT documents
|
|
2. **Plan** — editable outline; optional deep research for up-to-date context
|
|
3. **Generate** — parallel HTML slides with templates and AI-adaptive layouts
|
|
4. **Refine** — sidebar AI chat editing, image swap, visual references
|
|
5. **Deliver** — multi-format export, or a public share link (with narration and subtitles)
|
|
|
|
**Local default:** SQLite + in-memory cache—one command to try, no PostgreSQL / Valkey required.
|
|
**Production recommended:** `docker compose` with Web + Worker + PostgreSQL + Valkey + MinIO.
|
|
|
|
---
|
|
|
|
## Features
|
|
|
|
### Multi-AI providers
|
|
|
|
- OpenAI GPT, Anthropic Claude, Google Gemini, Azure OpenAI
|
|
- OpenAI-compatible endpoints (DeepSeek, Moonshot, Qwen, …)
|
|
- Ollama local models; per-role routing (outline / slides / editor / template / speech) for cost control
|
|
|
|
### Files & deep research
|
|
|
|
- Formats: PDF / Word / Markdown / TXT / Excel / PowerPoint
|
|
- High-quality parsing via MinerU + MarkItDown
|
|
- Multi-engine retrieval with Tavily + SearXNG and web summarization
|
|
|
|
### Smart images
|
|
|
|
- Three sources: local gallery / Pixabay & Unsplash / DALL·E, SiliconFlow, Pollinations, OpenAI, Gemini
|
|
- AI matching; automatic resize, format conversion, quality tuning
|
|
- Image service is **off by default** (`ENABLE_IMAGE_SERVICE`)
|
|
|
|
### Templates & projects
|
|
|
|
- Global master template + scenario templates (general / tourism / education, …)
|
|
- Extract layout from uploaded reference PPTX; project-level AI-adaptive templates
|
|
- Four-stage workflow: requirements → outline → task tracking → PPT generation
|
|
- Stage restart/resume, visual outline editor, one-click public sharing
|
|
|
|
### Platform & ops
|
|
|
|
- Single-container Docker or multi-service Compose; async jobs (PDF / PPTX / narration video)
|
|
- Local accounts, GitHub / Linux Do OAuth, email verification, registration rate limits
|
|
- Optional credits, SMTP / Resend, Cloudflare Turnstile
|
|
|
|
---
|
|
|
|
## Screenshots
|
|
|
|
### Main interface
|
|
|
|

|
|
|
|
### Outline & generation result
|
|
|
|

|
|
|
|

|
|
|
|
<details>
|
|
<summary><b>More screenshots (editor / speech / export / templates)</b></summary>
|
|
|
|
#### Main interface (alt)
|
|
|
|

|
|
|
|
#### Generation result (alt)
|
|
|
|

|
|
|
|
#### Online editing
|
|
|
|

|
|
|
|

|
|
|
|

|
|
|
|

|
|
|
|
#### Speech script
|
|
|
|

|
|
|
|
#### Template generation
|
|
|
|

|
|
|
|
</details>
|
|
|
|
---
|
|
|
|
## Dependencies & Scope
|
|
|
|
Separate **minimum runnable** from **full feature set** so you are not surprised after first boot.
|
|
|
|
| Capability | Dependency | Notes |
|
|
|------------|------------|--------|
|
|
| Core generation (outline / HTML PPT) | At least one AI provider key | **Required** |
|
|
| Local models | Ollama, etc. | Optional offline inference |
|
|
| Deep research | `TAVILY_API_KEY` or SearXNG | Optional |
|
|
| Web / AI images | Gallery or image-gen keys + `ENABLE_IMAGE_SERVICE=true` | Optional (off by default) |
|
|
| **Standard editable PPTX** | **`APRYSE_LICENSE_KEY` (commercial)** | **Optional, but required for editable PPTX** |
|
|
| Image-based PPTX | No Apryse | Higher visual fidelity; in-slide elements usually not editable |
|
|
| Narration video | `ffmpeg`; optional ComfyUI TTS | Optional |
|
|
| Multi-user / background jobs | PostgreSQL + Valkey + MinIO + Worker | Prefer Compose |
|
|
|
|
> **Production security**
|
|
> - Change `SECRET_KEY` and admin password; do not ship default `admin` / `admin123`
|
|
> - Production compose disables admin bootstrap by default—enable explicitly on first deploy only
|
|
> - Use strong random `LANDPPT_API_KEY` / `LANDPPT_API_KEYS`
|
|
> - Never commit real secrets to Git
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
### System requirements
|
|
|
|
- Python 3.11+
|
|
- SQLite 3 (local default)
|
|
- ffmpeg (for narration video export)
|
|
- Docker (optional)
|
|
|
|
### Database migrations
|
|
|
|
- Pending migrations run automatically on startup; disable with `LANDPPT_AUTO_MIGRATE_ON_STARTUP=false`
|
|
- Local default is SQLite; set `DATABASE_URL` only when you want PostgreSQL or another external DB
|
|
- For multi-node shared databases, disable auto-migrate and run a one-off migration job
|
|
|
|
### Option 1: uv (recommended for local)
|
|
|
|
```bash
|
|
git clone https://github.com/sligter/LandPPT.git
|
|
cd LandPPT
|
|
|
|
# Install uv if needed
|
|
# Windows (PowerShell)
|
|
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
# macOS / Linux
|
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
|
uv sync --extra dev
|
|
cp .env.example .env
|
|
# Edit .env — configure at least one AI API key
|
|
|
|
# Defaults to :8000 with SQLite + memory cache
|
|
uv run python run.py
|
|
```
|
|
|
|
### Option 2: pip
|
|
|
|
```bash
|
|
git clone https://github.com/sligter/LandPPT.git
|
|
cd LandPPT
|
|
|
|
python -m venv venv
|
|
# Windows: venv\Scripts\activate
|
|
# macOS / Linux: source venv/bin/activate
|
|
|
|
pip install -e .
|
|
cp .env.example .env
|
|
# Edit .env with AI API keys
|
|
|
|
python run.py
|
|
```
|
|
|
|
### Option 3: Docker single container
|
|
|
|
```bash
|
|
docker pull bradleylzh/landppt:latest
|
|
|
|
docker run -d \
|
|
--name landppt \
|
|
-p 8000:8000 \
|
|
-v $(pwd)/.env:/app/.env \
|
|
-v landppt_data:/app/data \
|
|
-v landppt_uploads:/app/uploads \
|
|
-v landppt_reports:/app/research_reports \
|
|
-v landppt_cache:/app/temp \
|
|
-v landppt_lib:/app/lib \
|
|
bradleylzh/landppt:latest
|
|
|
|
docker logs -f landppt
|
|
```
|
|
|
|
> Create and configure `.env` (at least one AI API key) before running.
|
|
|
|
### Option 4: Docker Compose (recommended for production)
|
|
|
|
Bundled `docker-compose.yml` starts **landppt (Web) + worker + PostgreSQL + Valkey + MinIO** (`minio-init` creates the bucket). Prefer plain `python run.py` for a lightweight local trial.
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
# At minimum: AI keys, SECRET_KEY, POSTGRES_PASSWORD
|
|
|
|
docker compose up -d
|
|
docker compose logs -f landppt
|
|
```
|
|
|
|
- App: `http://localhost:8000` (override with `LANDPPT_PORT`)
|
|
- MinIO console: `http://localhost:9001`
|
|
- Production disables admin auto-bootstrap by default; set `LANDPPT_BOOTSTRAP_ADMIN_ENABLED=true` and admin credentials for first deploy
|
|
- Default image `bradleylzh/landppt:latest`; override with `LANDPPT_IMAGE`
|
|
|
|
### Option 5: Development (hot reload)
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
docker compose -f docker-compose-dev.yaml up -d --build
|
|
docker compose -f docker-compose-dev.yaml logs -f landppt
|
|
```
|
|
|
|
Builds from the local Dockerfile, mounts sources, enables hot reload; bootstraps `admin` / `admin123` by default.
|
|
|
|
---
|
|
|
|
## Usage Guide
|
|
|
|
### 1. Access the service
|
|
|
|
| Entry | URL |
|
|
|-------|-----|
|
|
| Web UI | http://localhost:8000 |
|
|
| API docs | http://localhost:8000/docs |
|
|
| Health | http://localhost:8000/health |
|
|
|
|
Local/dev often bootstraps `admin` / `admin123` via `LANDPPT_BOOTSTRAP_ADMIN_*`. **Always change or disable this in production.**
|
|
|
|
### 2. Configure AI providers
|
|
|
|
In the settings UI or `.env`:
|
|
|
|
- OpenAI API key (also works with DeepSeek, Moonshot, Qwen, and other OpenAI-compatible APIs)
|
|
- Anthropic / Google API keys
|
|
- Or local Ollama
|
|
|
|
### 3. Create a PPT project
|
|
|
|
1. **Requirements** — topic, audience, page range, scenario template
|
|
2. **Outline** — structured outline with visual editing
|
|
3. **Research** (optional) — deep research for fresh context
|
|
4. **Images** (optional) — local / web / AI generation
|
|
5. **Generate** — HTML presentation from the outline
|
|
|
|
### 4. Edit & export
|
|
|
|
- Sidebar AI chat for content and style; upload images as visual references
|
|
- Speech scripts (DOCX / Markdown / PPT notes)
|
|
- Per-slide narration: Edge-TTS or ComfyUI Qwen3-TD (reference audio supported)
|
|
- Narrated MP4 (1080p, 30/60fps, optional subtitles)
|
|
- Export PDF, HTML, **standard PPTX**, **image-based PPTX**, scripts, etc.
|
|
- One-click public share (share page plays narration and subtitles)
|
|
|
|
### 5. Automation APIs
|
|
|
|
- API-key auth for CI, scripts, n8n, custom backends
|
|
- OpenAI-compatible: `/v1/chat/completions`, `/v1/completions`, `/v1/models`
|
|
- Project-level export / share / speech endpoints for non-browser flows
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
Full list: [`.env.example`](.env.example). Advanced options: `src/landppt/core/config.py`. Below is **minimum runnable** + **production must-change** only.
|
|
|
|
### Minimum (local)
|
|
|
|
```bash
|
|
# At least one AI provider
|
|
DEFAULT_AI_PROVIDER=openai
|
|
OPENAI_API_KEY=your_openai_api_key_here
|
|
# or ANTHROPIC_API_KEY / GOOGLE_API_KEY / local Ollama
|
|
|
|
HOST=0.0.0.0
|
|
PORT=8000
|
|
|
|
# Local defaults (optional to set)
|
|
# DATABASE_URL=sqlite:///./landppt.db
|
|
# CACHE_BACKEND=memory
|
|
```
|
|
|
|
### Production must-change
|
|
|
|
```bash
|
|
SECRET_KEY=replace-with-long-random-string
|
|
POSTGRES_PASSWORD=replace-with-strong-password # Compose production stack
|
|
|
|
LANDPPT_BOOTSTRAP_ADMIN_ENABLED=false # or true + custom credentials
|
|
# LANDPPT_BOOTSTRAP_ADMIN_USERNAME=...
|
|
# LANDPPT_BOOTSTRAP_ADMIN_PASSWORD=...
|
|
|
|
LANDPPT_API_KEY=replace-with-strong-random-key
|
|
# or multi-key: LANDPPT_API_KEYS=admin:prod-key,robot:n8n-key
|
|
|
|
# Production storage example
|
|
# DATABASE_URL=postgresql://landppt:password@localhost:5432/landppt
|
|
# CACHE_BACKEND=valkey
|
|
# VALKEY_URL=valkey://localhost:6379
|
|
```
|
|
|
|
### Enable as needed
|
|
|
|
```bash
|
|
# Per-role model routing (cost control)
|
|
OUTLINE_MODEL_NAME=gpt-4o-mini
|
|
SLIDE_GENERATION_MODEL_NAME=gpt-4o
|
|
SPEECH_SCRIPT_MODEL_NAME=gpt-4o-mini
|
|
|
|
# Deep research
|
|
TAVILY_API_KEY=...
|
|
# SEARXNG_HOST=http://localhost:8888
|
|
# RESEARCH_PROVIDER=tavily # tavily | searxng | both
|
|
|
|
# Image service (off by default)
|
|
ENABLE_IMAGE_SERVICE=true
|
|
PIXABAY_API_KEY=...
|
|
UNSPLASH_ACCESS_KEY=...
|
|
SILICONFLOW_API_KEY=...
|
|
|
|
# Standard editable PPTX (commercial license)
|
|
APRYSE_LICENSE_KEY=...
|
|
|
|
# Optional ComfyUI TTS
|
|
# COMFYUI_BASE_URL=http://127.0.0.1:8188
|
|
# COMFYUI_TTS_WORKFLOW_PATH=tests/Qwen3-TD-TTS.json
|
|
|
|
# Registration / OAuth / email / credits / Turnstile
|
|
# ENABLE_USER_REGISTRATION=true
|
|
# GITHUB_OAUTH_ENABLED=false
|
|
# ENABLE_CREDITS_SYSTEM=false
|
|
```
|
|
|
|
**Notes:**
|
|
|
|
- **Standard PPTX** needs `APRYSE_LICENSE_KEY`. **Image-based PPTX** (`/api/projects/{project_id}/export/pptx-images`) does not; better for complex CSS/icons.
|
|
- If images still point at `localhost` behind a reverse proxy, set **BASE_URL** in Web “Application Configuration”. See [docs/base_url_configuration.md](docs/base_url_configuration.md).
|
|
- Narration video requires `ffmpeg` on the host/container.
|
|
|
|
---
|
|
|
|
## FAQ
|
|
|
|
### Q: Which AI models are supported?
|
|
|
|
OpenAI GPT (and compatible APIs), Anthropic Claude, Google Gemini, Azure OpenAI, Ollama local models, and more. Switch providers in the config UI.
|
|
|
|
### Q: How do I enable images?
|
|
|
|
Set `ENABLE_IMAGE_SERVICE=true` and configure:
|
|
|
|
- Pixabay: `PIXABAY_API_KEY`
|
|
- Unsplash: `UNSPLASH_ACCESS_KEY`
|
|
- AI generation: `SILICONFLOW_API_KEY` or `POLLINATIONS_API_KEY`, etc.
|
|
|
|
### Q: Image links break behind Nginx/Apache?
|
|
|
|
Without a correct `BASE_URL`, links may still use `localhost:8000`.
|
|
|
|
1. Open `https://your-domain.com/ai-config`
|
|
2. Application Configuration → Base URL
|
|
3. Save
|
|
|
|
### Q: How does research work?
|
|
|
|
Configure `TAVILY_API_KEY` or a SearXNG instance, then enable research when creating a project.
|
|
|
|
### Q: Fully local deployment?
|
|
|
|
Yes—Docker or source install. Point inference at Ollama if you want no external LLM APIs (research / web images may still need network).
|
|
|
|
### Q: Standard PPTX vs image-based PPTX?
|
|
|
|
| Type | Dependency | Best for |
|
|
|------|------------|----------|
|
|
| Standard PPTX | `APRYSE_LICENSE_KEY` | Further editing in PowerPoint |
|
|
| Image-based PPTX | No Apryse | Visual fidelity of complex layouts; elements usually not editable |
|
|
|
|
### Q: Public share links?
|
|
|
|
Use Share in the project editor, or `POST /api/projects/{project_id}/share/generate`. URL shape: `/share/{share_token}`. Disable via `share/disable`.
|
|
|
|
### Q: Production vs development Compose?
|
|
|
|
- **Production:** `docker compose up -d` (pre-built image + Web/Worker/Postgres/Valkey/MinIO)
|
|
- **Development:** `docker compose -f docker-compose-dev.yaml up -d --build` (local build + hot reload)
|
|
|
|
### Q: Narration providers?
|
|
|
|
Edge-TTS by default; optional ComfyUI Qwen3-TD with reference-audio upload.
|
|
|
|
### Q: Does parallel generation hurt quality?
|
|
|
|
No. Parallelism only changes scheduling; per-slide quality is unchanged. Providers may still rate-limit concurrency.
|
|
|
|
---
|
|
|
|
## Contributing
|
|
|
|
Issues, PRs, and docs improvements are welcome.
|
|
|
|
1. Fork the repo
|
|
2. Branch: `git checkout -b feature/AmazingFeature`
|
|
3. Commit: `git commit -m 'Add some AmazingFeature'`
|
|
4. Push and open a Pull Request
|
|
|
|
Bugs & ideas: [Issues](https://github.com/sligter/LandPPT/issues)
|
|
|
|
---
|
|
|
|
## License
|
|
|
|
Licensed under the [Apache License 2.0](LICENSE).
|
|
|
|
> Third-party components such as Apryse (used for standard PPTX export) have their own terms—ensure compliance before use.
|
|
|
|
---
|
|
|
|
## Star History
|
|
|
|
[](https://www.star-history.com/#sligter/LandPPT&Date)
|
|
|
|
---
|
|
|
|
## Contact
|
|
|
|
- **Homepage**: https://github.com/sligter/LandPPT
|
|
- **Issues**: https://github.com/sligter/LandPPT/issues
|
|
- **Discussions**: https://github.com/sligter/LandPPT/discussions
|
|
- **Email**: [ai@yydsapp.com](mailto:ai@yydsapp.com)
|
|
|
|
---
|
|
|
|
<div align="center">
|
|
|
|
**If this project helps you, please give it a :star:!**
|
|
|
|
Made with :heart: by the LandPPT Team
|
|
|
|
</div>
|