kinemotion 0.32.3__tar.gz → 0.33.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kinemotion might be problematic. Click here for more details.
- kinemotion-0.33.0/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +267 -0
- kinemotion-0.33.0/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +350 -0
- kinemotion-0.33.0/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +397 -0
- kinemotion-0.33.0/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +342 -0
- kinemotion-0.33.0/.basic-memory/development/backend-code-coverage-analysis.md +121 -0
- kinemotion-0.33.0/.basic-memory/development/backend-code-duplication-analysis.md +161 -0
- kinemotion-0.33.0/.basic-memory/development/backend-sonar-cloud-integration-status.md +149 -0
- kinemotion-0.32.3/.github/workflows/deploy.yml → kinemotion-0.33.0/.github/workflows/deploy-backend.yml +28 -17
- kinemotion-0.33.0/.serena/memories/backend-cors-fastapi-middleware-order.md +122 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/CHANGELOG.md +32 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/PKG-INFO +1 -1
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/src/kinemotion_backend/app.py +109 -41
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/tests/test_validation.py +2 -1
- {kinemotion-0.32.3 → kinemotion-0.33.0}/pyproject.toml +1 -1
- kinemotion-0.33.0/scripts/setup-github-deploy.sh +136 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/sonar-project.properties +1 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/uv.lock +1 -1
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/hooks/fix-basic-memory-names.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.cursor/mcp.json +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.dockerignore +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.gitattributes +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.github/workflows/security.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.gitignore +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.mcp.json +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.readthedocs.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.serena/.gitignore +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.serena/project.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.tool-versions +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/.vercelignore +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/CLAUDE.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/Dockerfile +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/GEMINI.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/LICENSE +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/SECURITY.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/.dockerignore +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/.env.example +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/Dockerfile +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/fly.toml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/pyproject.toml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/tests/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/backend/uv.lock +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/api/core.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/api/overview.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/development/testing.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/index.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/quick-start.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/docs/validation-status.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/.env.example +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/.gitignore +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/index.html +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/package.json +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/App.tsx +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/index.css +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/vercel.json +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/frontend/yarn.lock +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/justfile +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/local_dev.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/mkdocs.yml +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/.gitignore +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/requirements-docs.txt +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/project/README.md +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/project.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/api.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/cmj_metrics_validator.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/cmj_validation_bounds.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/dropjump_metrics_validator.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/dropjump_validation_bounds.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/__init__.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_adaptive_threshold.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_api.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_aspect_ratio.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_cli_cmj.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_cli_dropjump.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_cli_imports.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_cmj_analysis.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_cmj_joint_angles.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_cmj_kinematics.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_cmj_physiological_bounds.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_com_estimation.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_contact_detection.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_dropjump_validation_integration.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_filtering.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_formatting.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_joint_angles.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_kinematics.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_polyorder.py +0 -0
- {kinemotion-0.32.3 → kinemotion-0.33.0}/tests/test_video_io.py +0 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Automated Deployment Setup - GitHub Actions with Workload Identity Federation
|
|
3
|
+
type: note
|
|
4
|
+
permalink: deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation-1
|
|
5
|
+
tags:
|
|
6
|
+
- ci-cd
|
|
7
|
+
- github-actions
|
|
8
|
+
- workload-identity
|
|
9
|
+
- automation
|
|
10
|
+
- deployment
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Automated Deployment Setup - GitHub Actions with Workload Identity Federation
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
Automated deployment is configured using **Workload Identity Federation** (keyless authentication):
|
|
18
|
+
- ✅ No static service account keys
|
|
19
|
+
- ✅ Short-lived tokens (auto-expire)
|
|
20
|
+
- ✅ Repository-scoped access
|
|
21
|
+
- ✅ Complete audit trail
|
|
22
|
+
|
|
23
|
+
## Current Configuration
|
|
24
|
+
|
|
25
|
+
**Workflow:** `.github/workflows/deploy-backend.yml`
|
|
26
|
+
**Setup Script:** `scripts/setup-github-deploy.sh`
|
|
27
|
+
|
|
28
|
+
**Workload Identity Provider:**
|
|
29
|
+
```
|
|
30
|
+
projects/1008251132682/locations/global/workloadIdentityPools/github-pool/providers/github-provider
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Service Account:**
|
|
34
|
+
```
|
|
35
|
+
github-actions-deploy@kinemotion-backend.iam.gserviceaccount.com
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Permissions Granted:**
|
|
39
|
+
- `roles/run.admin` - Deploy Cloud Run services
|
|
40
|
+
- `roles/iam.serviceAccountUser` - Required for Cloud Run
|
|
41
|
+
- `roles/storage.admin` - Build and upload containers
|
|
42
|
+
- `roles/cloudbuild.builds.editor` - Source-based deployments
|
|
43
|
+
|
|
44
|
+
## How Auto-Deployment Works
|
|
45
|
+
|
|
46
|
+
**Trigger:** Push to `main` branch with changes to:
|
|
47
|
+
- `backend/**`
|
|
48
|
+
- `src/kinemotion/**`
|
|
49
|
+
- `.github/workflows/deploy-backend.yml`
|
|
50
|
+
|
|
51
|
+
**Workflow Steps:**
|
|
52
|
+
1. **Test** - Run pytest, pyright, ruff
|
|
53
|
+
2. **Build** - Build Docker image, run Trivy security scan
|
|
54
|
+
3. **Deploy** - Deploy to Cloud Run with 2Gi memory + CORS env var
|
|
55
|
+
4. **Verify** - Health check at `/health` endpoint
|
|
56
|
+
|
|
57
|
+
**Deployment Command Used:**
|
|
58
|
+
```yaml
|
|
59
|
+
- uses: google-github-actions/deploy-cloudrun@v2
|
|
60
|
+
with:
|
|
61
|
+
service: kinemotion-backend
|
|
62
|
+
region: us-central1
|
|
63
|
+
source: ./backend
|
|
64
|
+
flags: |
|
|
65
|
+
--memory=2Gi
|
|
66
|
+
--allow-unauthenticated
|
|
67
|
+
--set-env-vars=CORS_ORIGINS=https://kinemotion.vercel.app
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Frontend Auto-Deployment
|
|
71
|
+
|
|
72
|
+
**Already configured!** Vercel has GitHub integration enabled:
|
|
73
|
+
- Push to `main` → Vercel automatically builds and deploys
|
|
74
|
+
- No additional setup needed
|
|
75
|
+
- Environment variable `VITE_API_URL` is set in Vercel project settings
|
|
76
|
+
|
|
77
|
+
## Testing the Setup
|
|
78
|
+
|
|
79
|
+
**Manual test:**
|
|
80
|
+
```bash
|
|
81
|
+
# Make a small change
|
|
82
|
+
echo "# Test deployment" >> backend/README.md
|
|
83
|
+
git add backend/README.md
|
|
84
|
+
git commit -m "test: trigger automated deployment"
|
|
85
|
+
git push origin main
|
|
86
|
+
|
|
87
|
+
# Watch the workflow
|
|
88
|
+
open https://github.com/feniix/kinemotion/actions
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Expected result:**
|
|
92
|
+
- Workflow runs automatically
|
|
93
|
+
- Tests pass → Build passes → Deploy succeeds
|
|
94
|
+
- New revision deployed to Cloud Run
|
|
95
|
+
- Health check passes
|
|
96
|
+
|
|
97
|
+
## Re-running Setup
|
|
98
|
+
|
|
99
|
+
The setup script is **idempotent** - safe to run multiple times:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
./scripts/setup-github-deploy.sh
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**What it does:**
|
|
106
|
+
- ✓ Checks if resources exist before creating
|
|
107
|
+
- ✓ Enables required APIs
|
|
108
|
+
- ✓ Creates workload identity pool + provider
|
|
109
|
+
- ✓ Creates service account with all permissions
|
|
110
|
+
- ✓ Binds GitHub repo to service account
|
|
111
|
+
- ✓ Outputs values for workflow file
|
|
112
|
+
|
|
113
|
+
**When to re-run:**
|
|
114
|
+
- Moving to a new Google Cloud project
|
|
115
|
+
- Setting up in a different repository
|
|
116
|
+
- Troubleshooting permission issues
|
|
117
|
+
- Verifying the configuration
|
|
118
|
+
|
|
119
|
+
## Security Benefits
|
|
120
|
+
|
|
121
|
+
**Traditional Approach (insecure):**
|
|
122
|
+
```
|
|
123
|
+
GitHub Secrets → Static JSON key → Can be stolen, must rotate, never expires
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Workload Identity Federation (secure):**
|
|
127
|
+
```
|
|
128
|
+
GitHub OIDC token → Google verifies repository → Temporary credentials (1 hour) → Auto-expires
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Access control:**
|
|
132
|
+
- Only `feniix/kinemotion` repository can use this identity
|
|
133
|
+
- Repository owner verified: `assertion.repository_owner=='feniix'`
|
|
134
|
+
- Tokens expire automatically
|
|
135
|
+
- No credentials in repository or secrets
|
|
136
|
+
|
|
137
|
+
## Monitoring Deployments
|
|
138
|
+
|
|
139
|
+
**GitHub Actions:**
|
|
140
|
+
- https://github.com/feniix/kinemotion/actions
|
|
141
|
+
- Shows all workflow runs, logs, and status
|
|
142
|
+
|
|
143
|
+
**Cloud Run Revisions:**
|
|
144
|
+
```bash
|
|
145
|
+
# List recent deployments
|
|
146
|
+
gcloud run revisions list \
|
|
147
|
+
--service kinemotion-backend \
|
|
148
|
+
--region us-central1 \
|
|
149
|
+
--limit 10
|
|
150
|
+
|
|
151
|
+
# Check current traffic routing
|
|
152
|
+
gcloud run services describe kinemotion-backend \
|
|
153
|
+
--region us-central1 \
|
|
154
|
+
--format='value(status.traffic)'
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Rollback Procedure
|
|
158
|
+
|
|
159
|
+
**If deployment breaks production:**
|
|
160
|
+
|
|
161
|
+
1. **Check workflow logs:**
|
|
162
|
+
- https://github.com/feniix/kinemotion/actions
|
|
163
|
+
- Click failed workflow → View logs
|
|
164
|
+
|
|
165
|
+
2. **Rollback to previous revision:**
|
|
166
|
+
```bash
|
|
167
|
+
# List revisions
|
|
168
|
+
gcloud run revisions list --service kinemotion-backend --region us-central1
|
|
169
|
+
|
|
170
|
+
# Route 100% traffic to previous good revision
|
|
171
|
+
gcloud run services update-traffic kinemotion-backend \
|
|
172
|
+
--region us-central1 \
|
|
173
|
+
--to-revisions kinemotion-backend-00013-abc=100
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
3. **Or rollback via Console:**
|
|
177
|
+
- Cloud Run → kinemotion-backend → Revisions tab
|
|
178
|
+
- Click previous revision → Manage Traffic → 100%
|
|
179
|
+
|
|
180
|
+
## Workflow Customization
|
|
181
|
+
|
|
182
|
+
**Add environment variables:**
|
|
183
|
+
|
|
184
|
+
Edit `.github/workflows/deploy-backend.yml`:
|
|
185
|
+
```yaml
|
|
186
|
+
flags: |
|
|
187
|
+
--memory=2Gi
|
|
188
|
+
--allow-unauthenticated
|
|
189
|
+
--set-env-vars=CORS_ORIGINS=https://kinemotion.vercel.app,NEW_VAR=value
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Change memory/CPU:**
|
|
193
|
+
```yaml
|
|
194
|
+
flags: |
|
|
195
|
+
--memory=4Gi
|
|
196
|
+
--cpu=2
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Add secrets from GitHub:**
|
|
200
|
+
```yaml
|
|
201
|
+
flags: |
|
|
202
|
+
--set-env-vars=API_KEY=${{ secrets.API_KEY }}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Troubleshooting
|
|
206
|
+
|
|
207
|
+
### Workflow fails with "permission denied"
|
|
208
|
+
|
|
209
|
+
**Check service account has all required roles:**
|
|
210
|
+
```bash
|
|
211
|
+
gcloud projects get-iam-policy kinemotion-backend \
|
|
212
|
+
--flatten="bindings[].members" \
|
|
213
|
+
--filter="bindings.members:github-actions-deploy@kinemotion-backend.iam.gserviceaccount.com" \
|
|
214
|
+
--format="table(bindings.role)"
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Should show:**
|
|
218
|
+
- roles/run.admin
|
|
219
|
+
- roles/iam.serviceAccountUser
|
|
220
|
+
- roles/storage.admin
|
|
221
|
+
- roles/cloudbuild.builds.editor
|
|
222
|
+
|
|
223
|
+
### Workflow fails with "workload identity pool not found"
|
|
224
|
+
|
|
225
|
+
**Verify pool exists:**
|
|
226
|
+
```bash
|
|
227
|
+
gcloud iam workload-identity-pools describe github-pool \
|
|
228
|
+
--location="global" \
|
|
229
|
+
--project=kinemotion-backend
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**If not found, re-run setup script.**
|
|
233
|
+
|
|
234
|
+
### Deployment succeeds but app doesn't work
|
|
235
|
+
|
|
236
|
+
**Check Cloud Run logs immediately:**
|
|
237
|
+
```bash
|
|
238
|
+
gcloud logging read \
|
|
239
|
+
"resource.labels.service_name=kinemotion-backend" \
|
|
240
|
+
--limit 50 \
|
|
241
|
+
--freshness=5m
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Common issues:**
|
|
245
|
+
- Memory still set to 512Mi (should be 2Gi)
|
|
246
|
+
- CORS_ORIGINS not set correctly
|
|
247
|
+
- Container crashes on startup
|
|
248
|
+
|
|
249
|
+
## Cost Impact
|
|
250
|
+
|
|
251
|
+
**GitHub Actions:**
|
|
252
|
+
- Free for public repositories
|
|
253
|
+
- 2,000 minutes/month for private repos
|
|
254
|
+
|
|
255
|
+
**Typical workflow runtime:**
|
|
256
|
+
- Tests: ~2 minutes
|
|
257
|
+
- Build: ~3 minutes
|
|
258
|
+
- Deploy: ~4 minutes
|
|
259
|
+
- **Total: ~9 minutes per deployment**
|
|
260
|
+
|
|
261
|
+
**With 10 deployments/month:** 90 minutes used (well within free tier)
|
|
262
|
+
|
|
263
|
+
## Related Documentation
|
|
264
|
+
|
|
265
|
+
- [Production Deployment Guide](memory://deployment/production-deployment-guide-vercel-google-cloud-run)
|
|
266
|
+
- [Quick Deployment Commands](memory://deployment/quick-deployment-commands-vercel-and-cloud-run)
|
|
267
|
+
- [Backend CORS Configuration](memory://backend-cors-fastapi-middleware-order)
|
kinemotion-0.33.0/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: CORS and Memory Issues - Production Debugging Guide
|
|
3
|
+
type: note
|
|
4
|
+
permalink: deployment/cors-and-memory-issues-production-debugging-guide-1
|
|
5
|
+
tags:
|
|
6
|
+
- cors
|
|
7
|
+
- debugging
|
|
8
|
+
- memory
|
|
9
|
+
- cloud-run
|
|
10
|
+
- vercel
|
|
11
|
+
- troubleshooting
|
|
12
|
+
- mediaπpe
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# CORS and Memory Issues - Production Debugging Guide
|
|
16
|
+
|
|
17
|
+
## The CORS + 503 Mystery (Solved)
|
|
18
|
+
|
|
19
|
+
### Symptom
|
|
20
|
+
```
|
|
21
|
+
Browser Console:
|
|
22
|
+
Access to XMLHttpRequest blocked by CORS policy:
|
|
23
|
+
No 'Access-Control-Allow-Origin' header present
|
|
24
|
+
Status: 503 Service Unavailable
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**But:**
|
|
28
|
+
- ✅ curl tests show CORS headers ARE present
|
|
29
|
+
- ✅ OPTIONS preflight succeeds
|
|
30
|
+
- ✅ Backend `/health` endpoint works
|
|
31
|
+
- ❌ POST requests with file uploads fail
|
|
32
|
+
|
|
33
|
+
### Root Cause
|
|
34
|
+
|
|
35
|
+
**Cloud Run container ran out of memory** (512MB → 556MB used during video processing). When the container exceeds memory:
|
|
36
|
+
|
|
37
|
+
1. Cloud Run's infrastructure **kills the container mid-request**
|
|
38
|
+
2. Returns a **503 from "Google Frontend"** (not your app)
|
|
39
|
+
3. The 503 response is **plain-text, no CORS headers** (because your app never ran)
|
|
40
|
+
4. Browser sees 503 without CORS headers → **CORS error**
|
|
41
|
+
|
|
42
|
+
### Why It Was Confusing
|
|
43
|
+
|
|
44
|
+
| Test Type | Result | Why |
|
|
45
|
+
|-----------|--------|-----|
|
|
46
|
+
| curl OPTIONS | ✅ 200 with CORS headers | Tiny request, doesn't load MediaPipe models |
|
|
47
|
+
| curl POST (empty) | ✅ 422 validation error | Validation happens before video processing |
|
|
48
|
+
| Browser POST (video) | ❌ 503 no CORS | Video processing loads MediaPipe → OOM crash |
|
|
49
|
+
| curl POST (video) | ❌ Timeout/503 | Same OOM crash, but curl shows different error |
|
|
50
|
+
|
|
51
|
+
### The Fix
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
gcloud run services update kinemotion-backend \
|
|
55
|
+
--region us-central1 \
|
|
56
|
+
--memory 2Gi
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Why 2GB:**
|
|
60
|
+
- Python runtime: ~100MB
|
|
61
|
+
- MediaPipe models: ~500MB
|
|
62
|
+
- Video processing buffers: ~300MB
|
|
63
|
+
- NumPy arrays: ~200MB
|
|
64
|
+
- Safety margin: ~900MB
|
|
65
|
+
- **Total headroom:** Handles concurrent requests + large videos
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## CORS Configuration Deep Dive
|
|
70
|
+
|
|
71
|
+
### FastAPI Middleware Order (Critical!)
|
|
72
|
+
|
|
73
|
+
**Problem:** FastAPI middleware is **LIFO** (Last In, First Out). If CORS is added AFTER other middleware, it won't wrap error responses.
|
|
74
|
+
|
|
75
|
+
**Wrong (CORS doesn't wrap rate limiter errors):**
|
|
76
|
+
```python
|
|
77
|
+
app = FastAPI(...)
|
|
78
|
+
|
|
79
|
+
limiter = Limiter(...) # Added first
|
|
80
|
+
app.state.limiter = limiter
|
|
81
|
+
|
|
82
|
+
app.add_middleware(CORSMiddleware, ...) # Added last → runs first
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Correct (CORS wraps everything):**
|
|
86
|
+
```python
|
|
87
|
+
app = FastAPI(...)
|
|
88
|
+
|
|
89
|
+
# Add CORS FIRST (runs last, wraps all responses)
|
|
90
|
+
app.add_middleware(CORSMiddleware,
|
|
91
|
+
allow_origins=cors_origins,
|
|
92
|
+
allow_credentials=False,
|
|
93
|
+
allow_methods=["GET", "POST", "OPTIONS"],
|
|
94
|
+
allow_headers=["Accept", "Content-Type", ...],
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Then configure other middleware
|
|
98
|
+
limiter = Limiter(...) # Added after → runs before CORS
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Environment Variable Parsing
|
|
102
|
+
|
|
103
|
+
**Problem:** Special characters in env vars can break gcloud parsing
|
|
104
|
+
|
|
105
|
+
**Wrong:**
|
|
106
|
+
```bash
|
|
107
|
+
# Comma gets parsed as separator
|
|
108
|
+
gcloud run deploy --set-env-vars CORS_ORIGINS=https://a.com,https://b.com
|
|
109
|
+
# Error: Bad syntax for dict arg
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Correct - Use env-vars-file:**
|
|
113
|
+
```bash
|
|
114
|
+
# Create env.yaml
|
|
115
|
+
cat > env.yaml <<EOF
|
|
116
|
+
CORS_ORIGINS: "https://a.com,https://b.com,https://c.com"
|
|
117
|
+
EOF
|
|
118
|
+
|
|
119
|
+
# Deploy with file
|
|
120
|
+
gcloud run deploy kinemotion-backend \
|
|
121
|
+
--region us-central1 \
|
|
122
|
+
--env-vars-file env.yaml
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Backend CORS Origins List
|
|
126
|
+
|
|
127
|
+
```python
|
|
128
|
+
cors_origins = [
|
|
129
|
+
"http://localhost:3000",
|
|
130
|
+
"http://localhost:5173", # Vite dev server
|
|
131
|
+
"http://localhost:8080",
|
|
132
|
+
"http://localhost:8888", # Test server
|
|
133
|
+
"http://127.0.0.1:3000",
|
|
134
|
+
"http://127.0.0.1:5173",
|
|
135
|
+
"http://127.0.0.1:8080",
|
|
136
|
+
"http://127.0.0.1:8888",
|
|
137
|
+
]
|
|
138
|
+
|
|
139
|
+
# Add production from env var
|
|
140
|
+
cors_origins_env = os.getenv("CORS_ORIGINS", "").strip()
|
|
141
|
+
if cors_origins_env:
|
|
142
|
+
prod_origins = [origin.strip() for origin in cors_origins_env.split(",")]
|
|
143
|
+
cors_origins.extend(prod_origins)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Strips whitespace** to handle `"https://a.com, https://b.com"` (with spaces)
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Debugging Workflow
|
|
151
|
+
|
|
152
|
+
### Step 1: Verify Backend is Running
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Health check
|
|
156
|
+
curl https://kinemotion-backend-1008251132682.us-central1.run.app/health
|
|
157
|
+
|
|
158
|
+
# Expected:
|
|
159
|
+
# {"status":"ok","service":"kinemotion-backend","version":"0.1.0",...}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Step 2: Test CORS Preflight
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
curl -v -X OPTIONS https://backend-url/api/analyze \
|
|
166
|
+
-H "Origin: https://kinemotion.vercel.app" \
|
|
167
|
+
-H "Access-Control-Request-Method: POST" \
|
|
168
|
+
-H "Access-Control-Request-Headers: content-type" 2>&1 | grep access-control
|
|
169
|
+
|
|
170
|
+
# Expected:
|
|
171
|
+
# < access-control-allow-origin: https://kinemotion.vercel.app
|
|
172
|
+
# < access-control-allow-methods: GET, POST, OPTIONS
|
|
173
|
+
# < access-control-allow-headers: ...
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Step 3: Test Actual POST (Without Video)
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
curl -X POST https://backend-url/api/analyze \
|
|
180
|
+
-H "Origin: https://kinemotion.vercel.app" \
|
|
181
|
+
-F "jump_type=cmj" \
|
|
182
|
+
-F "quality=balanced"
|
|
183
|
+
|
|
184
|
+
# Expected: 422 validation error (file missing)
|
|
185
|
+
# {"detail":[{"type":"missing","loc":["body","file"],"msg":"Field required"}]}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
If this fails with 503 or no CORS headers → **memory issue** or middleware order issue.
|
|
189
|
+
|
|
190
|
+
### Step 4: Check Cloud Run Logs
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
gcloud logging read \
|
|
194
|
+
"resource.type=cloud_run_revision AND resource.labels.service_name=kinemotion-backend" \
|
|
195
|
+
--limit 50 \
|
|
196
|
+
--format json \
|
|
197
|
+
--freshness=5m | python3 -c "import sys,json; logs=json.load(sys.stdin); [print(f\"{l.get('timestamp','')}: {l.get('textPayload','')}\") for l in logs]"
|
|
198
|
+
|
|
199
|
+
# Look for:
|
|
200
|
+
# - "Memory limit exceeded"
|
|
201
|
+
# - "container instance was found to be using too much memory and was terminated"
|
|
202
|
+
# - 503 errors
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Step 5: Create Local Test Page
|
|
206
|
+
|
|
207
|
+
**Bypasses Vercel to isolate backend issues:**
|
|
208
|
+
|
|
209
|
+
```html
|
|
210
|
+
<!-- test.html -->
|
|
211
|
+
<!DOCTYPE html>
|
|
212
|
+
<html>
|
|
213
|
+
<body>
|
|
214
|
+
<input type="file" id="video">
|
|
215
|
+
<button onclick="upload()">Upload</button>
|
|
216
|
+
<pre id="result"></pre>
|
|
217
|
+
<script>
|
|
218
|
+
async function upload() {
|
|
219
|
+
const formData = new FormData();
|
|
220
|
+
formData.append('file', document.getElementById('video').files[0]);
|
|
221
|
+
formData.append('jump_type', 'cmj');
|
|
222
|
+
|
|
223
|
+
try {
|
|
224
|
+
const res = await fetch('https://backend-url/api/analyze', {
|
|
225
|
+
method: 'POST',
|
|
226
|
+
body: formData
|
|
227
|
+
});
|
|
228
|
+
const data = await res.json();
|
|
229
|
+
document.getElementById('result').textContent = JSON.stringify(data, null, 2);
|
|
230
|
+
} catch (err) {
|
|
231
|
+
document.getElementById('result').textContent = err.message;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
</script>
|
|
235
|
+
</body>
|
|
236
|
+
</html>
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Serve locally:**
|
|
240
|
+
```bash
|
|
241
|
+
cd frontend
|
|
242
|
+
python3 -m http.server 8888
|
|
243
|
+
# Open http://localhost:8888/test.html
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
If this works but Vercel doesn't → Vercel caching or env var issue.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Memory Profiling
|
|
251
|
+
|
|
252
|
+
### Check Current Memory Usage
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
# Get service configuration
|
|
256
|
+
gcloud run services describe kinemotion-backend \
|
|
257
|
+
--region us-central1 \
|
|
258
|
+
--format='value(spec.template.spec.containers[0].resources.limits.memory)'
|
|
259
|
+
|
|
260
|
+
# Should output: 2Gi
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Monitor Memory in Real-Time
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# Stream logs (watch for memory warnings)
|
|
267
|
+
gcloud logging read \
|
|
268
|
+
"resource.labels.service_name=kinemotion-backend AND textPayload=~'Memory'" \
|
|
269
|
+
--limit 20 \
|
|
270
|
+
--format json \
|
|
271
|
+
--freshness=10m
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Memory Usage Patterns
|
|
275
|
+
|
|
276
|
+
**From Cloud Run logs analysis:**
|
|
277
|
+
- **Idle startup:** ~100MB (Python + uvicorn)
|
|
278
|
+
- **First request:** ~500MB spike (MediaPipe model loading)
|
|
279
|
+
- **Processing 1080p video:** ~600-800MB
|
|
280
|
+
- **Peak during processing:** ~1.2GB (large video + NumPy arrays)
|
|
281
|
+
|
|
282
|
+
**Why 512MB failed:**
|
|
283
|
+
- Base: 100MB
|
|
284
|
+
- MediaPipe: 500MB
|
|
285
|
+
- Processing: 200MB
|
|
286
|
+
- **Total:** 800MB → **exceeds 512MB limit**
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Vite Environment Variables
|
|
291
|
+
|
|
292
|
+
### How They Work
|
|
293
|
+
|
|
294
|
+
Vite replaces `import.meta.env.VITE_*` at **build time**, not runtime:
|
|
295
|
+
|
|
296
|
+
```typescript
|
|
297
|
+
// In code:
|
|
298
|
+
const apiUrl = import.meta.env.VITE_API_URL || ''
|
|
299
|
+
|
|
300
|
+
// After build (if VITE_API_URL=https://backend.com):
|
|
301
|
+
const apiUrl = "https://backend.com" || ''
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
**Critical:** Environment variables are **baked into the JavaScript bundle** during `yarn build`. Changing env vars requires redeployment.
|
|
305
|
+
|
|
306
|
+
### Vercel Environment Variables
|
|
307
|
+
|
|
308
|
+
**Set in Dashboard:**
|
|
309
|
+
1. Project → Settings → Environment Variables
|
|
310
|
+
2. Add `VITE_API_URL` for Production
|
|
311
|
+
3. **Must redeploy** for it to take effect
|
|
312
|
+
|
|
313
|
+
**Verify it's embedded:**
|
|
314
|
+
```bash
|
|
315
|
+
# Check if backend URL is in the JavaScript bundle
|
|
316
|
+
curl -s https://kinemotion.vercel.app/ | grep -o 'kinemotion-backend'
|
|
317
|
+
|
|
318
|
+
# Should return: kinemotion-backend-1008251132682
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
If no match → env var wasn't set before build, or Vercel is serving cached version.
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Production URLs
|
|
326
|
+
|
|
327
|
+
**Frontend:** https://kinemotion.vercel.app/
|
|
328
|
+
**Backend:** https://kinemotion-backend-1008251132682.us-central1.run.app
|
|
329
|
+
|
|
330
|
+
**Environment Variables:**
|
|
331
|
+
- **Vercel:** `VITE_API_URL=https://kinemotion-backend-1008251132682.us-central1.run.app`
|
|
332
|
+
- **Cloud Run:** `CORS_ORIGINS=https://kinemotion.vercel.app`
|
|
333
|
+
|
|
334
|
+
**Configuration:**
|
|
335
|
+
- **Cloud Run Memory:** 2Gi (required for MediaPipe)
|
|
336
|
+
- **Cloud Run Region:** us-central1 (Tier 1 pricing)
|
|
337
|
+
- **Vercel Root Directory:** `frontend/`
|
|
338
|
+
- **Vercel Framework:** Vite (auto-detected)
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## Lessons Learned
|
|
343
|
+
|
|
344
|
+
1. **Always check Cloud Run logs first** when debugging CORS + 503
|
|
345
|
+
2. **OOM crashes return 503 without CORS headers** (infrastructure-level error)
|
|
346
|
+
3. **CORS middleware must be added FIRST** in FastAPI (LIFO order)
|
|
347
|
+
4. **Vite env vars are build-time**, not runtime (must redeploy after changes)
|
|
348
|
+
5. **Use env-vars-file for complex values** (commas, special chars)
|
|
349
|
+
6. **512MB is too low for MediaPipe** (need minimum 2GB)
|
|
350
|
+
7. **Local test page** is fastest way to isolate backend issues
|