MovePal is a software-engineering training project in the SE4CVndNN GitHub organization. The team is building a playful browser-based movement game in which an avatar demonstrates a simple movement, the user tries it in front of a webcam or with an included fallback sample, and the application returns friendly feedback, stars, and a short session summary.
MovePal is a prototype for playful movement practice. It is not a medical device, diagnostic tool, clinical rehabilitation system, or replacement for a physiotherapist or another healthcare professional.
- Kickoff: Monday, 13 July 2026
- Sprint: Tuesday, 14 July–Wednesday, 29 July 2026
- Development team: Team B /
team-movepal - External QA team: Team A /
team-aidsign - Release-candidate freeze: Tuesday, 28 July 2026
- External manual QA: Wednesday, 29 July 2026
- Release-candidate tag:
sprint1-rc1 - Frozen application SHA:
bfde35e112f3846fbf1771bc362154b32c72249a - Default branch:
master - Python: 3.11
- Repository: private, under a GitHub Free organization
Instructor checkpoints are held on Monday and Wednesday at 20:00 Palestine time, for at most one hour. The development team also holds a focused daily stand-up of approximately 10 minutes.
By the end of Sprint 1, MovePal should provide a demonstrable Flask web application with:
- a clear child-friendly game interface;
- webcam capture and a reliable sample-image or sample-video fallback;
- pretrained pose-landmark extraction;
- three supported movements:
- raise both arms;
- side reach to the left or right;
- knee lift or step in place;
- visibility and framing checks;
- rule-based movement evaluation;
- friendly, non-medical feedback;
- stars or points;
- a short session summary;
- invalid-input and low-confidence handling;
- automated tests, Ruff checks, and Windows/Linux CI;
- privacy, limitations, QA, and demonstration documentation.
The full Product Backlog contains later improvements, but students must not begin post-Sprint, future, or optional work unless the Product Owner and instructor explicitly change the Sprint scope.
Sprint 1 development and the MP-024 release-candidate handoff are complete on
master. The frozen sprint1-rc1 application includes the Flask game loop,
live camera and photo input, a deterministic model-free fallback, MediaPipe
pose extraction, three movement families, friendly feedback, session scoring
and summary, privacy/error hardening, automated tests, and Windows/Linux CI.
External QA is coordinated through MP-025 and MP-028 through MP-033. The
release decision remains Pending QA evidence until those reports and any
required retests are recorded. See
docs/release_notes.md and
docs/qa_handoff.md.
Every student should read these files before beginning an assigned issue:
docs/student_start_here.mddocs/sprint_kickoff.mddocs/sprint_execution_plan.mddocs/role_playbooks.mddocs/project_scope.mddocs/architecture.mdCONTRIBUTING.mddocs/manual_pr_policy.mddocs/privacy.mddocs/limitations.mdbacklog/sprint_1_plan.md- the assigned GitHub issue and every dependency referenced by that issue.
Final delivery package:
Useful planning reports:
backlog/assignment_report.csvbacklog/workload_report.mdbacklog/dependency_report.mdbacklog/blocked_task_report.mdbacklog/review_assignment_report.md
# From the repository root
py -3.11 -m venv .venv
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements-dev.txt# From the repository root
python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-dev.txtIf python3.11 is not available, install Python 3.11 before continuing. Do not silently use a different major/minor version without discussing compatibility with the Scrum Master.
The application runs with development defaults, so this step is optional for
local testing. .env.example documents the available variable
names, but python run.py does not automatically load a .env file. Set an
override in the shell that starts Flask.
$env:SECRET_KEY = "replace-with-a-random-local-value"
$env:MAX_CONTENT_LENGTH_MB = "5"
python run.pyLinux/macOS:
export SECRET_KEY="replace-with-a-random-local-value"
export MAX_CONTENT_LENGTH_MB="5"
python run.pyNever commit a real secret or a local .env file.
Run all checks from the repository root:
python -m ruff check .
python -m ruff format --check .
python -m pytest
python -m compileall app tests scripts
python scripts/qa_selfcheck.py --skip-lint
python -c "from app import create_app; assert create_app().name == 'app'"If Node.js is already installed, an additional JavaScript syntax check is:
node --check app/static/js/app.jsThis is the same sequence Windows and Linux CI run on every push and pull request to master (see .github/workflows/ci.yml).
Run the application:
python run.pyThen open the address printed by Flask, normally http://127.0.0.1:5000/.
POST /api/frame uses MediaPipePoseAdapter, which needs a downloaded
MediaPipe Pose Landmarker .task model bundle on disk. This file is not
committed to the repository (privacy/size — see
docs/adr/002-pose-estimator.md) and is
ignored by .gitignore. Automated tests never need it: pytest runs entirely
against the offline fixtures in data/landmarks/.
To exercise a real frame locally, download the model once into the repository
root (or any path, if you also set POSE_MODEL_PATH):
python -c "import urllib.request; urllib.request.urlretrieve(
'https://storage.googleapis.com/mediapipe-models/pose_landmarker/'
'pose_landmarker_lite/float16/latest/pose_landmarker_lite.task',
'pose_landmarker_lite.task')"By default the app looks for pose_landmarker_lite.task next to run.py.
Set the POSE_MODEL_PATH environment variable to point somewhere else
instead. Never commit the downloaded file or any real captured frame.
The health endpoint is:
GET /api/health
A healthy starter application returns JSON equivalent to:
{
"service": "movepal",
"status": "ok"
}app/
├── __init__.py Flask application factory
├── config.py Portable configuration and upload limits
├── routes/ Thin HTML and JSON routes
├── services/ Pose, movement, feedback, scoring, session logic
├── templates/ Jinja HTML templates
└── static/ CSS, JavaScript, images, and movement assets
data/
├── schemas/ Landmark and evaluation schemas
└── landmarks/ Synthetic/derived fallback and test fixtures
tests/
├── unit/ Service-level deterministic tests
├── integration/ Flask route and component-contract tests
└── fixtures/ Tiny checked-in test inputs
docs/ Product, architecture, privacy, data, QA, and demo guidance
backlog/ Authoritative machine-readable and readable planning data
.github/ Issue templates, PR template, and CI workflows
Use pathlib.Path for filesystem paths. Do not hard-code Windows drive letters or platform-specific separators in Python code.
Assigned issue
→ verify dependencies
→ create a feature branch
→ produce the practical first output
→ implement and test
→ open a draft pull request
→ obtain independent review
→ pass Windows and Linux CI
→ resolve comments
→ squash merge into master
→ move the issue to Done
Example branch:
mp-014-raise-arms-vertical-slice
Example PR title:
MP-014: Add sample-to-feedback vertical slice
Follow CONTRIBUTING.md and docs/manual_pr_policy.md. Students must not push directly to master.
- Keep Flask routes thin.
- Put pose, movement, scoring, feedback, and session logic in services.
- Validate uploads before processing them.
- Use allowed file types and configured size limits.
- Do not log images, raw frames, personal information, or private file paths.
- Use deterministic landmark fixtures in automated tests.
- Do not require a real camera or a large model/data download in CI.
- Return an explicit retry or low-confidence result instead of forcing success.
- Keep feedback friendly and non-medical.
- Update documentation when behavior or contracts change.
Sprint 1 requires no child data. Calibration or usability work may use consenting adult volunteers only after the instructor approves the collection procedure.
Prefer storing derived landmarks rather than video. Keep raw recordings under private, ignored storage such as data/private/ or data/raw/; never commit them, upload them to Actions, or attach them to issues.
Read:
docs/privacy.mddocs/dataset_card.mddocs/collection_protocol.mddocs/annotation_guide.mddocs/consent_template.md
The movement rules are transparent game heuristics, not clinical measurements. Thresholds must be configurable, tested with positive/negative/borderline fixtures, and justified in the evaluation notes.
Read docs/movement_specification.md before implementing or reviewing movement logic.
External QA is performed by team-aidsign on 29 July against
sprint1-rc1. QA members run manual sanity checks and open separate bug
issues; they do not silently modify MovePal code. If a release-critical fix is
required, the existing tag stays immutable and a separately reviewed and
retested candidate must be recorded.
Read:
docs/qa_plan.mddocs/qa_handoff.mddocs/demo_plan.mddocs/release_notes.mddocs/contribution_report.mddocs/retrospective.md
Use a process-only policy change:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
.\.venv\Scripts\Activate.ps1This applies only to the current PowerShell session.
Confirm that the active interpreter is Python 3.11:
python --version
python -m pip --versionDelete and recreate the virtual environment if it was created with another Python version.
Do not block the demonstration on a specific device. Use the built-in deterministic fallback, which evaluates the selected movement through the same movement API without requiring a camera or pose-model download. Record the browser, operating system, and observed permission behavior in the QA issue.
Check both Windows and Linux logs. Common causes include case-sensitive paths, hard-coded separators, files not committed to Git, current-working-directory assumptions, and tests that access real hardware.
Do not bypass it silently. Comment on the issue, move the item to Blocked, identify the missing output, and notify the Scrum Master. Continue another ready task only after coordination.
The owner/bootstrap scripts are for project administration. Students should not rerun them unless explicitly instructed:
scripts/bootstrap_org.ps1scripts/prepare_repository.pyscripts/import_backlog.pyscripts/validate_external_asset.py
The authoritative task descriptions are the GitHub issues and backlog/product_backlog.json.