Join a live interactive stage — polls, Q&A, quizzes, and more.
- Main app (presenter):
stage.uwuapps.org→main/ - Live view (audience):
live.stage.uwuapps.org/:slug→live/
stage-connect/
├── main/ → Vercel project 1: stage.uwuapps.org
│ ├── public/ → Static frontend (HTML, CSS, JS, PWA)
│ ├── api/ → Serverless functions
│ │ ├── auth/ → register, login, logout, me
│ │ ├── stages/ → create, list, publish, unpublish
│ │ └── interactions/ → poll, qa, quiz, survey, wordcloud, reaction, chat, comment
│ ├── lib/ → Shared helpers (supabase.js, auth.js)
│ ├── package.json
│ └── vercel.json
│
├── live/ → Vercel project 2: live.stage.uwuapps.org
│ ├── public/ → Audience-facing HTML/CSS/JS
│ ├── api/stage/ → Edge function: [slug].js
│ └── vercel.json
│
├── shared/
│ └── db-schema.sql → All Supabase table definitions
│
└── README.md- Create a Supabase project.
- Run
shared/db-schema.sqlin the SQL editor. - Ensure you have existing
uwu_usersanduwu_sessionstables (shared with other uwuapps). - Copy your Project URL and Service Role Key (not the anon key).
- Optionally enable Realtime for the tables listed at the bottom of the SQL file.
Push this entire folder as a single public GitHub repo.
Project 1 (main presenter app):
- Import the repo in Vercel
- Set Root Directory:
main - Add env vars:
SUPABASE_URL= your Supabase project URLSUPABASE_SERVICE_KEY= your service role key
- Assign custom domain:
stage.uwuapps.org
Project 2 (live audience view):
- Import the same repo in Vercel again
- Set Root Directory:
live - Add env vars:
SUPABASE_URL= sameSUPABASE_SERVICE_KEY= sameMAIN_API_URL=https://stage.uwuapps.org
- Assign custom domain:
live.stage.uwuapps.org
Place your own icon-192.png and icon-512.png in:
main/public/icons/live/public/icons/(or symlink — Vercel doesn't support symlinks; copy them)
Not required. Everything runs on Vercel + Supabase. Your Debian VPS is not needed for this project.
| Feature | Presenter controls | Audience action |
|---|---|---|
| Polls | Create, toggle active, view live bars | Vote once |
| Word Cloud | View, clear | Submit a word |
| Q&A | Pin, mark answered, hide | Submit question, vote |
| Quiz | Create questions, activate, view answers | Answer with countdown |
| Surveys | Create multi-question surveys | Submit once |
| Reactions | View counts live | Tap reaction |
| Chat | View, clear all | Send message |
| Comments | View, hide, vote counts | Post, upvote/downvote |
- Presenter clicks Go Live, enters a slug (e.g.
my-event) - App calls
POST /api/stages/publish→ setsis_live=true,slug=my-event - Audience visits
live.stage.uwuapps.org/my-event - Edge function
live/api/stage/[slug].jsfetches stage data from Supabase live.htmlloads and calls the main API onstage.uwuapps.orgfor all interactions- When presenter clicks End Session,
POST /api/stages/unpublish→ setsis_live=false,slug=null(slug is released for anyone else to use)