Duward A — Render Deploy Guide
Project: GPT Workout Planner
Repo: final-project-angldu6
Goal: Put your mobile-friendly Flask workout planner online for Demo Day.
This guide is tailored to your current repo. Your app has app.py, planner.py, workouts/options.json, workouts/history.json, templates, pyproject.toml, and uv.lock. It needs gunicorn, an OpenAI environment variable, and render.yaml.
Before You Start
Make sure the app works locally:
uv sync
uv run flask --app app run --debug
Open the preview, submit a goal like build muscle, choose a location, and confirm a workout plan appears.
Step 1 — Add the Production Server
Render should run your Flask app with gunicorn.
uv add gunicorn
This updates pyproject.toml and uv.lock.
Step 2 — Add .env.example
Your app uses OpenAI() after load_dotenv(), so Render needs this environment variable:
OPENAI_API_KEY
Create .env.example at the project root:
OPENAI_API_KEY=
Keep your real .env file private. Do not commit the actual key.
Step 3 — Create render.yaml
Create a new file at the project root named render.yaml:
services:
- type: web
name: gpt-workout-planner
env: python
plan: free
buildCommand: uv sync --frozen && uv cache prune --ci
startCommand: uv run gunicorn app:app
autoDeploy: true
envVars:
- key: OPENAI_API_KEY
sync: false
Your workouts/options.json file is committed, so Render can load the same workout choices as your local app.
Step 4 — Commit and Push
In Source Control, stage and commit:
pyproject.tomluv.lock.env.examplerender.yaml
Use a message like:
add render deploy config
Then click Sync Changes.
Step 5 — Create the Render Service
- Go to render.com and sign in with GitHub.
- Click New + → Web Service.
- Connect
final-project-angldu6. - Confirm these settings:
- Environment:
Python - Build Command:
uv sync --frozen && uv cache prune --ci - Start Command:
uv run gunicorn app:app - Plan:
Free
- Environment:
- In Environment Variables, add your real
OPENAI_API_KEY. - Click Create Web Service.
Step 6 — Test the Live Site
When Render finishes, open the live URL and test the core flow:
- Submit a clear goal like
build muscle. - Try both location choices.
- Confirm the generated plan appears.
- Open the previous workouts page.
- Try clearing history.
If the app crashes after submit, check that OPENAI_API_KEY is set in Render.
Demo Day Notes
Your app writes recent workout history to workouts/history.json. On Render's free tier, file changes made by visitors can disappear after a redeploy. For demo day, this is fine: open the app before presenting, generate one or two fresh workouts, and show the history from that live session.