---
title: "Deploy Banana Slides"
description: "AI slide maker: turn prompts or files into editable PPTs with voice."
category: "AI/ML"
url: https://railway.com/deploy/bananaslides
---

# Deploy Banana Slides

AI slide maker: turn prompts or files into editable PPTs with voice.

**[Deploy Banana Slides on Railway](https://railway.com/template/bananaslides)**

- **Category:** AI/ML

## Template content

### banana-slides

- **Image:** xiaosong233/banana-slides-railway:latest
- **Start command:** `sh -c 'rm -f /etc/nginx/sites-enabled/default && exec /usr/bin/supervisord -c /app/docker/supervisord.conf'`
- **Public domain:** Yes

## Documentation

# Deploy and Host BananaSlides on Railway

BananaSlides is an open-source AI presentation generator that creates slide decks from user prompts and content. It uses Google Gemini to generate presentation content and images, with configurable output language, request retries, concurrency, and generation timeouts. The application provides a self-hosted web interface for creating AI-powered presentations.

## About Hosting BananaSlides

Hosting BananaSlides on Railway uses the published `xiaosong233/banana-slides-railway:latest` Docker image and exposes the Flask application on port `80`. Railway provides the public HTTP/HTTPS networking layer, while the container runs the application in production mode using its documented Supervisor startup command. The deployment requires a Google Gemini API key for AI generation and uses Railway-generated secrets for application security and access control.

BananaSlides does not require a separate database service or documented persistent volume for the supplied deployment. Configuration is managed through Railway Variables, including the Gemini API endpoint, output language, concurrency limits, retry settings, CORS configuration, and request timeout. Railway handles the public domain and TLS, so no separate reverse proxy is required.

## Common Use Cases

* **AI Presentation Generation:** Generate presentation slides and supporting content from prompts using Google Gemini.
* **Automated Slide Creation:** Integrate AI-powered presentation generation into internal workflows and applications.
* **Self-Hosted Presentation Tools:** Run an independent BananaSlides instance with your own Gemini API credentials and application access controls.

## Dependencies for BananaSlides Hosting

* **BananaSlides Docker Image:** `xiaosong233/banana-slides-railway:latest`
* **Google Gemini API:** Required for AI-powered presentation generation.
* **Railway Variables:** Used for the Gemini API key, application secrets, access code, and runtime configuration.
* **Railway Public Networking:** Required to expose the Flask application.

### Implementation Details

## Docker

Deploy the published Docker image:

```docker
xiaosong233/banana-slides-railway:latest
```

The application listens on port `80`:

```env
PORT=80
```

Railway should deploy the service using the Docker image. No custom build command is required.

The documented startup command is:

```bash
sh -c 'rm -f /etc/nginx/sites-enabled/default &amp;&amp; exec /usr/bin/supervisord -c /app/docker/supervisord.conf'
```

Use this as the Railway Start Command for the template.

## Public Networking

| Setting          | Value           |
| ---------------- | --------------- |
| Proxy Type       | HTTP Proxy      |
| Target Port      | `80`            |
| Application Port | `80`            |
| Protocol         | HTTP            |
| HTTPS            | Railway-managed |

After deployment, open **Settings → Networking → Generate Domain** to create the public BananaSlides URL.

Railway handles HTTPS termination, so the container does not need its own public TLS configuration.

## Environment Variables

| Variable                  | Required | Description                                         |
| ------------------------- | -------- | --------------------------------------------------- |
| `PORT`                    | Yes      | Port the Flask application listens on. Set to `80`. |
| `FLASK_ENV`               | Yes      | Application environment. Set to `production`.       |
| `LOG_LEVEL`               | Yes      | Application logging level. Set to `INFO`.           |
| `SECRET_KEY`              | Yes      | Secret key used for application security.           |
| `ACCESS_CODE`             | Yes      | Access code required for application access.        |
| `CORS_ORIGINS`            | Yes      | Allowed CORS origins.                               |
| `GENAI_TIMEOUT`           | Yes      | GenAI request timeout in seconds.                   |
| `GOOGLE_API_KEY`          | Yes      | Google Gemini API key used for AI generation.       |
| `GOOGLE_API_BASE`         | Yes      | Google Generative Language API base URL.            |
| `OUTPUT_LANGUAGE`         | Yes      | Default language for generated output.              |
| `GENAI_MAX_RETRIES`       | Yes      | Maximum number of GenAI request retries.            |
| `MAX_IMAGE_WORKERS`       | Yes      | Maximum concurrent image-generation workers.        |
| `AI_PROVIDER_FORMAT`      | Yes      | AI provider format.                                 |
| `MAX_DESCRIPTION_WORKERS` | Yes      | Maximum concurrent description-generation workers.  |

Configure the Railway Raw Editor with:

```env
PORT=80
FLASK_ENV=production
LOG_LEVEL=INFO
SECRET_KEY=${{secret(64, "abcdef0123456789")}}
ACCESS_CODE=${{secret(32, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")}}
CORS_ORIGINS=*
GENAI_TIMEOUT=300.0
GOOGLE_API_KEY=
GOOGLE_API_BASE=https://generativelanguage.googleapis.com
OUTPUT_LANGUAGE=en
GENAI_MAX_RETRIES=2
MAX_IMAGE_WORKERS=8
AI_PROVIDER_FORMAT=gemini
MAX_DESCRIPTION_WORKERS=5
```

### Google Gemini API Key

Set `GOOGLE_API_KEY` to a valid Google Gemini API key.

The supplied configuration uses:

```text
https://generativelanguage.googleapis.com
```

as the Google Generative Language API base URL and:

```text
gemini
```

as the AI provider format.

Keep the API key private and store it in Railway Variables rather than committing it to source control.

## Persistent Storage

No persistent volume is documented as required for this BananaSlides deployment.

The supplied configuration does not specify a database, uploads directory, or persistent application filesystem that must survive container replacement. Do not add a Railway Volume unless a later BananaSlides release explicitly requires persistent storage.

## Database

No external database is required by the supplied BananaSlides deployment configuration.

The template can therefore run as a single Railway application service with the required environment variables.

## Build &amp; Start

Because BananaSlides is deployed from a published Docker image, no custom build command is required.

Use:

```text
xiaosong233/banana-slides-railway:latest
```

Set the Start Command to:

```bash
sh -c 'rm -f /etc/nginx/sites-enabled/default &amp;&amp; exec /usr/bin/supervisord -c /app/docker/supervisord.conf'
```

This removes the default Nginx site configuration before starting Supervisor with the application's provided configuration.

## Accessing the Application

After deployment:

1. Open the BananaSlides service in Railway.
2. Go to **Settings → Networking**.
3. Select **Generate Domain**.
4. Open the generated HTTPS URL.
5. Enter the configured `ACCESS_CODE` when the application requests access.

The public URL is generated by Railway and should not be hard-coded into the application configuration.

### Security

`SECRET_KEY` and `ACCESS_CODE` should remain secret.

The template uses Railway-generated secrets:

```env
SECRET_KEY=${{secret(64, "abcdef0123456789")}}
ACCESS_CODE=${{secret(32, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")}}
```

Do not replace these with credentials committed to a repository.

### Performance Configuration

BananaSlides exposes several concurrency and reliability settings:

```env
GENAI_TIMEOUT=300.0
GENAI_MAX_RETRIES=2
MAX_IMAGE_WORKERS=8
MAX_DESCRIPTION_WORKERS=5
```

Increase worker counts only when the Railway service has sufficient resources and the configured Gemini API quota can support the additional concurrent requests.

### CORS

The supplied configuration uses:

```env
CORS_ORIGINS=*
```

This allows requests from all origins. For a restricted production deployment, use the application's supported CORS configuration to limit origins to the domains that should access BananaSlides.

## Why Deploy BananaSlides on Railway?

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying BananaSlides on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.


## Similar templates

- [Chat Chat](https://railway.com/deploy/-WWW5r) — Chat Chat, your own unified chat and search to AI platform.
- [stella](https://railway.com/deploy/stella) — Self-host stella with web, API, Postgres, Redis, and object storage.
- [Hermes Agent | OpenClaw Alternative with Dashboard](https://railway.com/deploy/hermes-agent-or-openclaw-alternative-wit) — Self-Hosted Hermes AI Agent for Telegram, Discord & Slack

Open this page in a browser: https://railway.com/deploy/bananaslides
