DanceMore 🕺

Learn to dance more with DanceMore

DanceMore is a dance learning platform designed to make practicing choreography fun, engaging, and accessible from anywhere. Choose from a library of choreographies, watch the reference video, then practice in front of your webcam while an on-device AI pose model (MoveNet) analyzes your movements in real time. You can also upload your own dance videos, allowing DanceMore to automatically extract key poses so you can learn virtually any choreography. Every practice session is saved to your account, where a personalized dashboard tracks your progress with performance history, personal bests, daily streaks, and completed choreographies. To encourage healthy training habits, DanceMore also includes a daily warmup checklist and rest-day reminders to help you practice consistently and safely.

Tech stack

Layer Tech
Frontend Next.js 16 (App Router), React 19, TypeScript, Recharts
Pose estimation TensorFlow.js + MoveNet (SinglePose Lightning), fully in-browser — video never leaves the device. Model self-hosted under public/models/ (no tfhub dependency at runtime), with CPU-backend fallback when WebGL is unavailable
Scoring Joint-angle comparison (8 joints), pure TypeScript (dancemore-spike/src/lib/pose.ts)
Backend Django 6 + Django REST Framework, JWT auth (SimpleJWT)
Database SQLite locally (zero config) · Postgres (Neon) in production
Deploy Render (render.yaml blueprint) + any static-friendly Next host (e.g. Vercel)

Repo layout

dancemore-spike/   # Next.js frontend (trainer, dashboard, /author move-capture tool)
dancemore-api/     # Django REST backend (auth, attempts, stats)
render.yaml        # Render blueprint for the backend

Run locally (zero config — SQLite, no env vars needed)

Backend (Python 3.12+):

cd dancemore-api
python -m venv venv
venv\Scripts\activate          # Windows  (macOS/Linux: source venv/bin/activate)
pip install -r requirements.txt
python manage.py migrate
python manage.py seed_demo      # optional: demo account with 3.5 weeks of history
python manage.py runserver 8000

Frontend (Node 18+):

cd dancemore-spike
npm install
echo NEXT_PUBLIC_API_URL=http://localhost:8000 > .env.local
npm run dev

Open http://localhost:3000, register (or log in as demo / demo1234), allow the camera, and practice. Capture your own moves at http://localhost:3000/author and paste the exported JSON into dancemore-spike/public/moves.json.

Deploy notes

Backend → Render (uses render.yaml at the repo root):

Env var Value
SECRET_KEY generated by the blueprint
DEBUG False
DATABASE_URL your Neon Postgres connection string
CORS_ALLOWED_ORIGINS the deployed frontend origin, e.g. https://dancemore.vercel.app
ALLOWED_HOSTS not needed — RENDER_EXTERNAL_HOSTNAME is trusted automatically

After the first deploy only, seed the demo account from the Render shell (it wipes and reseeds, so it's deliberately not in the build command):

python manage.py seed_demo

Frontend → Vercel (or similar): set one env var, NEXT_PUBLIC_API_URL, to the Render service URL. There are no other backend references.

Verification tooling

  • dancemore-api/verify_api.py — API smoke test (auth, attempts, stats, isolation) against a running server
  • dancemore-api/verify_streak.py — streak edge cases across day boundaries (python manage.py shell < verify_streak.py)
  • dancemore-spike/e2e_verify.cjs — Playwright end-to-end run of the full product (register → warmup → practice → save → dashboard → rest nudge → logout)

Built With

Share this project:

Updates