Trollgorithm Theme Song Booth - customer-facing request form, admin dashboard, kiosk queue, and delivery pipeline for AI-generated theme songs.
This repository has been archived on 2026-09-04. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
Find a file
2026-07-31 19:51:38 +00:00
templates Initial prototype for theme song booth 2026-07-31 19:47:52 +00:00
.env.example Initial prototype for theme song booth 2026-07-31 19:47:52 +00:00
.gitignore Initial prototype for theme song booth 2026-07-31 19:47:52 +00:00
app.py Initial prototype for theme song booth 2026-07-31 19:47:52 +00:00
config.py Initial prototype for theme song booth 2026-07-31 19:47:52 +00:00
docker-compose.yml Switch deployment target from Unraid to Portainer; update docker-compose and docs 2026-07-31 19:51:38 +00:00
Dockerfile Initial prototype for theme song booth 2026-07-31 19:47:52 +00:00
init_db.py Initial prototype for theme song booth 2026-07-31 19:47:52 +00:00
models.py Initial prototype for theme song booth 2026-07-31 19:47:52 +00:00
README.md Switch deployment target from Unraid to Portainer; update docker-compose and docs 2026-07-31 19:51:38 +00:00
requirements.txt Initial prototype for theme song booth 2026-07-31 19:47:52 +00:00

Theme Song Booth

Prototype web app for a convention booth where attendees request custom AI-generated theme songs.

Flow

  1. Customer fills out the public request form at /request.
  2. Operator generates a Suno Custom Mode prompt via Hermes and saves it in the admin detail page.
  3. Operator generates two song versions in Suno and uploads the MP3s in admin.
  4. Operator clicks Send Preview Link. Customer receives an email with a private player page.
  5. Customer listens to Version A and Version B, then approves one/both or requests changes.
  6. Operator sees the approval alert, collects payment via Square reader, then clicks Mark Paid & Deliver.
  7. Customer receives the approved MP3(s) as email attachments.

Local Development

cd /home/jess/workspace/theme-song-booth
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cp .env.example .env
# Edit .env and set APP_SECRET_KEY, ADMIN_PASSWORD_HASH, SMTP_PASS, PUBLIC_BASE_URL
.venv/bin/python init_db.py
.venv/bin/python -m flask --app app run --host=0.0.0.0

Generate an admin password hash with:

.venv/bin/python -c "from werkzeug.security import generate_password_hash; print(generate_password_hash('yourpassword'))"

Deployment with Portainer

The repo includes a docker-compose.yml that builds directly from GitLab, so Portainer can pull and deploy it as a stack.

  1. Log in to your Portainer instance.
  2. Go to StacksAdd stack.
  3. Choose Repository and paste:
    • URL: https://gitlab.hallsworth.ca/yrtria/theme-song-booth.git
    • Branch: main
    • Compose path: docker-compose.yml
  4. Add environment variables in Portainer (or upload a .env file):
    • APP_SECRET_KEY
    • ADMIN_PASSWORD_HASH
    • SMTP_PASS
    • PUBLIC_BASE_URL (your HTTPS domain)
    • ADMIN_ALERT_EMAIL
  5. Deploy the stack.
  6. Open a console into the booth container and run once:
    python init_db.py
    
  7. Point your reverse proxy (Nginx Proxy Manager, Traefik, Caddy, etc.) at http://host-ip:8000 on the chosen domain.
  8. Print the booth QR code pointing to https://your-domain/request.

Portainer Notes

  • The docker-compose.yml uses named volumes (booth-data, booth-uploads) so Portainer handles persistence automatically.
  • For a pre-built image instead of repo build, replace the build: block with an image: line pointing to your registry.
  • Update the stack after each push to redeploy the latest code.

Files

  • app.py — Flask application with public/admin routes and email logic.
  • models.py — SQLite schema and helper functions.
  • config.py — Configuration loaded from environment.
  • templates/ — Jinja2 HTML templates.
  • init_db.py — Standalone script to create the SQLite database.
  • Dockerfile / docker-compose.yml — Container packaging for Portainer.