Railway

Deploy Banana Slides

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

Deploy Banana Slides

/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

SettingValue
Proxy TypeHTTP Proxy
Target Port80
Application Port80
ProtocolHTTP
HTTPSRailway-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

VariableRequiredDescription
PORTYesPort the Flask application listens on. Set to 80.
FLASK_ENVYesApplication environment. Set to production.
LOG_LEVELYesApplication logging level. Set to INFO.
SECRET_KEYYesSecret key used for application security.
ACCESS_CODEYesAccess code required for application access.
CORS_ORIGINSYesAllowed CORS origins.
GENAI_TIMEOUTYesGenAI request timeout in seconds.
GOOGLE_API_KEYYesGoogle Gemini API key used for AI generation.
GOOGLE_API_BASEYesGoogle Generative Language API base URL.
OUTPUT_LANGUAGEYesDefault language for generated output.
GENAI_MAX_RETRIESYesMaximum number of GenAI request retries.
MAX_IMAGE_WORKERSYesMaximum concurrent image-generation workers.
AI_PROVIDER_FORMATYesAI provider format.
MAX_DESCRIPTION_WORKERSYesMaximum 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:

  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:

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

More templates in this category

View Template
Chat Chat
Chat Chat, your own unified chat and search to AI platform.

okisdev
113
View Template
stella
Self-host stella with web, API, Postgres, Redis, and object storage.

Jan Kubica
1
View Template
Hermes Agent | OpenClaw Alternative with Dashboard
Self-Hosted Hermes AI Agent for Telegram, Discord & Slack

codestorm
57