Deploy Banana Slides
AI slide maker: turn prompts or files into editable PPTs with voice.
banana-slides
Just deployed
/app/backend/instance
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:
xiaosong233/banana-slides-railway:latest
The application listens on port 80:
PORT=80
Railway should deploy the service using the Docker image. No custom build command is required.
The documented startup command is:
sh -c 'rm -f /etc/nginx/sites-enabled/default && 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:
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:
https://generativelanguage.googleapis.com
as the Google Generative Language API base URL and:
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 & Start
Because BananaSlides is deployed from a published Docker image, no custom build command is required.
Use:
xiaosong233/banana-slides-railway:latest
Set the Start Command to:
sh -c 'rm -f /etc/nginx/sites-enabled/default && 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:
- Open the BananaSlides service in Railway.
- Go to Settings → Networking.
- Select Generate Domain.
- Open the generated HTTPS URL.
- Enter the configured
ACCESS_CODEwhen 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:
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:
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:
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.
Template Content
banana-slides
xiaosong233/banana-slides-railway:latestGOOGLE_API_KEY
Google Gemini API key
