Banana Slides draws each slide with an image model, then hands you an editable PPTX; version 0.9.0 is still in release candidates
An all-in-one native AI PPT generator that creates a full slide deck in minutes: upload any template image or materials for smart parsing, generate from a single sentence, an outline, or page descriptions, edit specific regions by voice, and export as editable PPT or video. An AI-native slides generator based on nano banana pro.
At a glance
- What is it?
- Banana Slides is an AGPL-3.0 Flask and TypeScript app that turns a sentence, an outline, page descriptions or uploaded documents into a slide deck using image generation models, with PPTX and video export. This piece covers how it is deployed, which providers it talks to, and the rough edges a self-hoster meets first.
- Who is it for?
- Banana Slides suits people who want a self-hosted deck generator driven by image models and are comfortable bringing their own Gemini, OpenAI, Anthropic, Volcengine or LazyLLM credentials. It is a poor fit for anyone who needs a stable tagged release, since the recent releases are all 0.9.0 candidates, or who cannot reach the Tsinghua PyPI mirror without editing pyproject.toml.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository last received commits 6 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.
Star history
- Anionex/banana-slides15,998 ★ · +413
| Repository | 2026-09-10 | 2026-11-13 |
|---|---|---|
| Anionex/banana-slides | 15.6k | 16k |
413 Stars in the last 64 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
Slides come from an image generation model, not a layout template engine
Banana Slides is built on image generation models, and it is pitched as a native AI PPT app that skips manual layout: you describe what you want in natural language and revise it the same way. The repository description names nano banana pro as its base. Input can be a single sentence, an outline or per-page descriptions, and you can upload a template image or source documents for it to parse. markitdown, PyPDF2 and PyMuPDF appear among the backend dependencies.
Editing is region based: you pick a part of a slide and change it, including by voice. Output is an editable PPT or a video; python-pptx, edge-tts and elevenlabs are all listed as backend dependencies, and RC5 added an immersive online slide player. The project also lists project history and reproducible workflows among its features.
Five provider formats sit behind one AI_PROVIDER_FORMAT switch
Which model family does the work is set by a single variable in .env.example. Gemini is the default:
AI_PROVIDER_FORMAT=geminiThe other accepted values are openai, volcengine, anthropic and lazyllm. Each format has its own key and base URL pair, such as GOOGLE_API_KEY with GOOGLE_API_BASE, OPENAI_API_KEY with OPENAI_API_BASE, and ANTHROPIC_API_KEY with ANTHROPIC_API_BASE plus ANTHROPIC_VERSION=2023-06-01. Gemini and OpenAI both default to a 300 second timeout and 2 retries, with the OpenAI comment noting that fewer retries avoid timeouts piling up. TEXT_MAX_OUTPUT_TOKENS=32768 caps text generation and image understanding globally.
The Volcengine format has a catch: Agent Plans need a dedicated API key and specific model names, doubao-seed-2.1-turbo and doubao-seedream-5.0-lite. A normal Volcengine key will not slot in. The LazyLLM format picks separate sources for text, image and image caption models, and sets LAZYLLM_ALLOW_INTERNAL_NETWORK=True so image downloads from private network storage do not fail.
Docker Compose runs two containers on ports 3011, 5011 and 1455
The default deployment is docker-compose.yml with a backend and a frontend container on a shared bridge network. The package.json wraps it:
"dev": "docker compose up",
"build": "docker compose build",
"start": "docker compose up -d",
"stop": "docker compose down",The frontend serves on host port 3011 by default, set by FRONTEND_PORT. The backend listens on 5000 inside the container and is published on 5011, set by BACKEND_PORT. A third port, 1455, is published for the OpenAI OAuth callback server, and it is fixed in the compose file rather than driven by a variable, so a host already using 1455 needs the file edited. The backend health check calls http://localhost:5000/health every 30 seconds with three retries. Both containers restart unless stopped. The repository also carries docker-compose.prod.yml, docker-compose.allinone.yml and Dockerfile.allinone for other layouts.
All state lives in two bind mounts you have to back up yourself
The backend persists two directories from the host. ./backend/instance holds the database, and ./uploads holds uploaded files. The backend uses Flask-SQLAlchemy with Alembic and Flask-Migrate for schema changes. The compose file declares named volumes backend-data and uploads-data at the bottom, but the services mount host paths, so your data sits in those two folders next to the compose file.
The consequence is that deleting or moving the checkout deletes your projects, and a backup has to include both folders, not only the database. Vertex AI users get one more mount: the compose file has a commented GOOGLE_APPLICATION_CREDENTIALS line and a commented read-only mount of gcp-service-account.json, both of which you uncomment and supply yourself.
pyproject.toml points uv at the Tsinghua PyPI mirror
Running the backend outside Docker uses uv. The package.json has these scripts for local development:
"dev:backend": "cd backend && uv run python app.py",
"dev:frontend": "cd frontend && npm run dev",The backend needs Python 3.10 or newer, and the frontend needs Node 18 or newer. The trap is in pyproject.toml, where the uv index is set to https://pypi.tuna.tsinghua.edu.cn/simple, the Tsinghua University mirror. Every uv sync goes through that mirror, wherever you are. If the mirror is slow or unreachable from your network, installs stall until you change the index-url line. The Docker build has the same concern handled through build arguments: APT_MIRROR, PYPI_INDEX_URL and NPM_REGISTRY can be set to whatever registry you can reach, along with DOCKER_REGISTRY and GHCR_REGISTRY.
The recent releases are all 0.9.0 release candidates
package.json and pyproject.toml both say 0.9.0, but the three most recent GitHub releases are candidates: v0.9.0-rc.5 on 2026-08-29, v0.9.0-rc.6 on 2026-08-30 and v0.9.0-rc.7 on 2026-09-05. The repository was last pushed on 2026-11-01, so development continues after RC7 without a newer tagged build.
The candidates carry real fixes. RC7 fixed the case where Codex, connected through OpenAI OAuth, returned 400 on image generation, by moving the internal main model from gpt-5.4 to gpt-5.6-terra while keeping gpt-image-2 as the image model; it also added content-driven style descriptions and SenseNova U1 image generation. RC6 added a toggleable desktop update check with download progress, retry and restart install, and fixed APIMart OpenAI-compatible async image tasks, non-streaming requests and the passing of 1K, 2K and 4K resolutions. Running Banana Slides today means running a release candidate.
Configuration comments and the default README are written in Chinese
The default README.md opens in Chinese, with translations in README_EN.md, README_JA.md, README_KO.md and README_PT-BR.md. The configuration files do not get the same treatment. The section headers and most comments in .env.example are in Chinese, as are many comments in docker-compose.yml, including the ones explaining which port is the host side and which volume holds the database. English readers can follow the variable names, which are in English, but the guidance about which settings are minimal and which are optional sits in the comments.
The sponsor slots reflect the same audience. AIHubMix and Volcengine are listed as sponsors, and the README routes mainland China users to an Inferera sign-up instead of AIHubMix. The proxy examples in .env.example also point at api.inferera.com.
Desktop app, CLI and tests ship from the same repository
Beyond the web app, the repository has desktop/, cli/ and skills/ directories. pyproject.toml registers a banana-cli command that runs cli.banana_cli.__main__:main, and the RC6 notes describe update checks for the desktop build. Tests are split by side:
"test:backend": "uv run pytest backend/tests/ -v",
"test:frontend": "cd frontend && npm test -- --run",There are also end-to-end tests, a Docker environment test, and a quick-check script that runs lint, frontend tests and backend tests together. Backend lint is flake8 restricted to the E9, F63, F7 and F82 checks. The project is AGPL-3.0, and a CLA.md sits in the root alongside CONTRIBUTING.md, so contributions go through a contributor agreement.
Editorial conclusion
Banana Slides suits people who want a self-hosted deck generator driven by image models and are comfortable bringing their own Gemini, OpenAI, Anthropic, Volcengine or LazyLLM credentials. It is a poor fit for anyone who needs a stable tagged release, since the recent releases are all 0.9.0 candidates, or who cannot reach the Tsinghua PyPI mirror without editing pyproject.toml. Before deploying, decide which AI_PROVIDER_FORMAT you will use, back up backend/instance and uploads, and check that ports 3011, 5011 and 1455 are free.
Frequently asked questions
What is Banana Slides?
Banana Slides is an AGPL-3.0 AI slide deck generator built on image generation models. It creates a deck from a sentence, an outline, page descriptions or uploaded documents, and exports editable PPT or video.
Which AI providers can Banana Slides use?
Banana Slides selects the provider with AI_PROVIDER_FORMAT, which accepts gemini (the default), openai, volcengine, anthropic and lazyllm. Each format has its own API key and base URL settings.
How do I run Banana Slides with Docker?
Fill in .env from .env.example and run docker compose up. The Banana Slides frontend is on port 3011 and the backend on port 5011 by default, with port 1455 used for the OpenAI OAuth callback.
Is there a stable Banana Slides 0.9.0 release?
The most recent Banana Slides releases are release candidates, with v0.9.0-rc.7 published on 2026-09-05.
Official sources
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.
[](https://hysenlabs.com/projects/anionex-banana-slides)Star history chart for your README
[](https://hysenlabs.com/projects/anionex-banana-slides)Was this useful?