kinemotion 0.33.2__tar.gz → 0.34.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.34.0/.basic-memory/api/supabase-authentication-setup-guide.md +428 -0
- kinemotion-0.34.0/.basic-memory/authentication/auth-provider-comparison-december-2025.md +43 -0
- kinemotion-0.34.0/.basic-memory/authentication/auth-providers-comparison-december-2025.md +13 -0
- kinemotion-0.34.0/.basic-memory/authentication/supabase-authentication-quick-start.md +88 -0
- kinemotion-0.34.0/.basic-memory/authentication/supabase-authentication-setup-guide.md +110 -0
- kinemotion-0.34.0/.basic-memory/authentication/supabase-authentication-technical-guide.md +428 -0
- kinemotion-0.34.0/.basic-memory/authentication/supabase-production-setup-guide.md +250 -0
- kinemotion-0.34.0/.basic-memory/authentication/supabase-quick-start-guide.md +247 -0
- kinemotion-0.34.0/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +102 -0
- kinemotion-0.34.0/.basic-memory/development/backend-authentication-and-logging-status.md +135 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +1 -1
- kinemotion-0.34.0/.basic-memory/development/structured-logging-implementation-complete.md +7 -0
- kinemotion-0.34.0/.basic-memory/development/structured-logging-implementation.md +73 -0
- kinemotion-0.34.0/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +47 -0
- kinemotion-0.34.0/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +218 -0
- kinemotion-0.34.0/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +42 -0
- kinemotion-0.34.0/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +246 -0
- kinemotion-0.34.0/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +235 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.cursor/mcp.json +6 -3
- kinemotion-0.34.0/.github/workflows/deploy-backend.yml +165 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/CHANGELOG.md +41 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/PKG-INFO +1 -1
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/Dockerfile +2 -1
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/README.md +7 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/pyproject.toml +5 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/src/kinemotion_backend/app.py +64 -22
- kinemotion-0.34.0/backend/src/kinemotion_backend/auth.py +181 -0
- kinemotion-0.34.0/backend/src/kinemotion_backend/logging_config.py +100 -0
- kinemotion-0.34.0/backend/src/kinemotion_backend/middleware.py +120 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/package.json +1 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/App.tsx +36 -2
- kinemotion-0.34.0/frontend/src/components/Auth.tsx +120 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/hooks/useAnalysis.ts +11 -0
- kinemotion-0.34.0/frontend/src/hooks/useAuth.ts +102 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/index.css +175 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/yarn.lock +124 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/pyproject.toml +1 -1
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/setup-github-deploy.sh +24 -0
- kinemotion-0.34.0/scripts/setup-supabase-local.sh +53 -0
- kinemotion-0.34.0/scripts/setup-supabase-production.sh +81 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/uv.lock +464 -1
- kinemotion-0.33.2/.github/workflows/deploy-backend.yml +0 -144
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/hooks/fix-basic-memory-names.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.dockerignore +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.gitattributes +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.github/workflows/security.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.gitignore +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.mcp.json +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.readthedocs.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/.gitignore +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.serena/project.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.tool-versions +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/.vercelignore +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/CLAUDE.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/Dockerfile +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/GEMINI.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/LICENSE +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/SECURITY.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/.dockerignore +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/.env.example +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/fly.toml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/tests/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/backend/uv.lock +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/api/core.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/api/overview.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/development/testing.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/index.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/quick-start.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/docs/validation-status.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/.env.example +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/.gitignore +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/index.html +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/vercel.json +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/justfile +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/local_dev.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/mkdocs.yml +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/.gitignore +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/requirements-docs.txt +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/project/README.md +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/project.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/sonar-project.properties +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/api.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/cmj_metrics_validator.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/cmj_validation_bounds.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/dropjump_metrics_validator.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/dropjump_validation_bounds.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/__init__.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_adaptive_threshold.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_api.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_aspect_ratio.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_cli_cmj.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_cli_dropjump.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_cli_imports.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_cmj_analysis.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_cmj_joint_angles.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_cmj_kinematics.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_cmj_physiological_bounds.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_com_estimation.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_contact_detection.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_dropjump_validation_integration.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_filtering.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_formatting.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_joint_angles.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_kinematics.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_polyorder.py +0 -0
- {kinemotion-0.33.2 → kinemotion-0.34.0}/tests/test_video_io.py +0 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Supabase Authentication Setup Guide
|
|
3
|
+
type: note
|
|
4
|
+
permalink: api/supabase-authentication-setup-guide-1
|
|
5
|
+
tags:
|
|
6
|
+
- '[''supabase'''
|
|
7
|
+
- '''authentication'''
|
|
8
|
+
- '''setup'''
|
|
9
|
+
- '''api'''
|
|
10
|
+
- '''documentation'']'
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Supabase Authentication Setup Guide
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
Kinemotion now uses Supabase for authentication, providing secure user management with JWT tokens.
|
|
18
|
+
|
|
19
|
+
**What's Included:**
|
|
20
|
+
- ✅ Email/password authentication
|
|
21
|
+
- ✅ JWT token validation in backend (RS256 + Auth server fallback)
|
|
22
|
+
- ✅ Automatic user ID logging in all requests
|
|
23
|
+
- ✅ Protected API endpoints
|
|
24
|
+
- ✅ Works with `kinemotion.vercel.app` domain
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Important: JWT Signing Keys (Modern Approach)
|
|
29
|
+
|
|
30
|
+
Supabase now uses **asymmetric JWT signing keys** (ES256/RS256) as the modern standard:
|
|
31
|
+
|
|
32
|
+
| Type | Algorithm | Status | Verification Method |
|
|
33
|
+
|------|-----------|--------|---------------------|
|
|
34
|
+
| **Asymmetric** (modern) | ES256/RS256 | ✅ **Recommended** | JWKS endpoint |
|
|
35
|
+
| **Symmetric** (legacy) | HS256 | ⚠️ Deprecated | Auth server fallback |
|
|
36
|
+
|
|
37
|
+
**Our backend supports both automatically:**
|
|
38
|
+
1. Tries asymmetric verification via JWKS endpoint first (modern)
|
|
39
|
+
2. Falls back to Auth server verification if JWKS is empty (legacy compatibility)
|
|
40
|
+
|
|
41
|
+
**To use the modern approach:**
|
|
42
|
+
1. Supabase Dashboard → **Settings** → **JWT signing keys**
|
|
43
|
+
2. Click **"Migrate JWT secret"** if you see it
|
|
44
|
+
3. Then click **"Rotate keys"** to start using ES256
|
|
45
|
+
|
|
46
|
+
> **Why ES256?** Faster verification, better security (public/private keys can't be forged), easier compliance (SOC2, HIPAA), and automatic key revocation via JWKS.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Step 1: Create Supabase Project
|
|
51
|
+
|
|
52
|
+
1. Go to [database.new](https://database.new) (official Supabase project creation URL)
|
|
53
|
+
2. Sign in or create a Supabase account
|
|
54
|
+
3. Create a new organization (if needed)
|
|
55
|
+
4. Fill in project details:
|
|
56
|
+
- **Project name:** `kinemotion`
|
|
57
|
+
- **Database password:** (click "Generate a password" for a strong password)
|
|
58
|
+
- **Region:** Choose closest to your users (e.g., `us-east-1`)
|
|
59
|
+
- **Plan:** Free (50,000 MAUs included)
|
|
60
|
+
5. Click **Create new project**
|
|
61
|
+
6. Wait for project to be created (~2 minutes)
|
|
62
|
+
|
|
63
|
+
> **Note:** New projects (created July 2025+) automatically use ES256 (asymmetric) signing keys. If you have an existing project with legacy JWT secret, migrate it: **Settings** → **JWT signing keys** → **Migrate JWT secret**.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Step 2: Get Supabase Credentials
|
|
68
|
+
|
|
69
|
+
Once your project is ready:
|
|
70
|
+
|
|
71
|
+
1. Go to **Settings** (gear icon in sidebar)
|
|
72
|
+
2. Click **API Keys** in the left menu
|
|
73
|
+
3. Copy the following:
|
|
74
|
+
|
|
75
|
+
| Credential | Location | Description |
|
|
76
|
+
|------------|----------|-------------|
|
|
77
|
+
| **Project URL** | Top of API Keys page | `https://xxx.supabase.co` |
|
|
78
|
+
| **Publishable key** | Under "Publishable key" | Safe for frontend (starts with `sb_publishable_...`) |
|
|
79
|
+
| **Secret key** | Under "Secret keys" | Server-side only (starts with `sb_secret_...`) |
|
|
80
|
+
|
|
81
|
+
> **Key Format Change (2025):** New projects use the `sb_publishable_xxx` format. Legacy projects may still show JWT-style keys starting with `eyJ...`. Both formats work the same way.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Step 3: Configure Authentication Settings
|
|
86
|
+
|
|
87
|
+
### URL Configuration
|
|
88
|
+
|
|
89
|
+
1. In Supabase dashboard, click **Authentication** in sidebar
|
|
90
|
+
2. Click **URL Configuration** in the left menu
|
|
91
|
+
3. Configure the following:
|
|
92
|
+
|
|
93
|
+
| Setting | Value | Purpose |
|
|
94
|
+
|---------|-------|---------|
|
|
95
|
+
| **Site URL** | `https://kinemotion.vercel.app` | Default redirect after auth |
|
|
96
|
+
| **Redirect URLs** | `https://kinemotion.vercel.app/**` | Production redirects |
|
|
97
|
+
| | `http://localhost:5173/**` | Local development |
|
|
98
|
+
|
|
99
|
+
> **Tip:** Use `/**` wildcard to allow all paths under your domain.
|
|
100
|
+
|
|
101
|
+
### Email Provider
|
|
102
|
+
|
|
103
|
+
1. Click **Providers** in the left menu
|
|
104
|
+
2. **Email** provider is enabled by default
|
|
105
|
+
3. *(Optional)* Configure email templates under **Email Templates**
|
|
106
|
+
|
|
107
|
+
### Social Providers (Optional)
|
|
108
|
+
|
|
109
|
+
1. Under **Providers**, enable Google, GitHub, etc.
|
|
110
|
+
2. Follow the setup instructions for each provider
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Step 4: Frontend Environment Variables
|
|
115
|
+
|
|
116
|
+
### Development (.env.local)
|
|
117
|
+
|
|
118
|
+
Create `frontend/.env.local`:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
VITE_SUPABASE_URL=https://your-project-id.supabase.co
|
|
122
|
+
VITE_SUPABASE_ANON_KEY=sb_publishable_xxxxxxxxxxxxxxxxxxxxx
|
|
123
|
+
VITE_API_URL=http://localhost:8000
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
> **Note:** New projects use `sb_publishable_xxx` format. Legacy projects may have JWT-style keys (`eyJ...`). Both formats work.
|
|
127
|
+
|
|
128
|
+
### Production (Vercel)
|
|
129
|
+
|
|
130
|
+
Add environment variables in Vercel dashboard:
|
|
131
|
+
|
|
132
|
+
1. Go to your project on [vercel.com](https://vercel.com)
|
|
133
|
+
2. Click **Settings** → **Environment Variables**
|
|
134
|
+
3. Add the following:
|
|
135
|
+
|
|
136
|
+
| Variable | Value | Environment |
|
|
137
|
+
|----------|-------|-------------|
|
|
138
|
+
| `VITE_SUPABASE_URL` | `https://xxx.supabase.co` | Production |
|
|
139
|
+
| `VITE_SUPABASE_ANON_KEY` | Your publishable key | Production |
|
|
140
|
+
| `VITE_API_URL` | `https://kinemotion-backend-xxx.run.app` | Production |
|
|
141
|
+
|
|
142
|
+
4. Click **Save** for each variable
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Step 5: Backend Environment Variables
|
|
147
|
+
|
|
148
|
+
### Development (.env)
|
|
149
|
+
|
|
150
|
+
Create `backend/.env`:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Required
|
|
154
|
+
SUPABASE_URL=https://your-project.supabase.co
|
|
155
|
+
|
|
156
|
+
# Optional (for Auth server fallback verification)
|
|
157
|
+
SUPABASE_ANON_KEY=sb_publishable_xxxxxxxxxxxxxxxxxxxxx
|
|
158
|
+
|
|
159
|
+
# Logging
|
|
160
|
+
LOG_LEVEL=INFO
|
|
161
|
+
JSON_LOGS=false
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Environment Variables Explained:**
|
|
165
|
+
|
|
166
|
+
| Variable | Required | Description |
|
|
167
|
+
|----------|----------|-------------|
|
|
168
|
+
| `SUPABASE_URL` | Yes | Your project URL (e.g., `https://xxx.supabase.co`) |
|
|
169
|
+
| `SUPABASE_ANON_KEY` | No | Anon/public key for Auth server fallback |
|
|
170
|
+
|
|
171
|
+
> **Note:** JWT secret is NOT needed for new RS256 projects. The backend verifies tokens via the public JWKS endpoint (`/.well-known/jwks.json`).
|
|
172
|
+
|
|
173
|
+
### Production (Cloud Run)
|
|
174
|
+
|
|
175
|
+
**Step 1: Create secrets in Google Cloud**
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Set Supabase URL secret (required)
|
|
179
|
+
echo -n "https://your-project-id.supabase.co" | \
|
|
180
|
+
gcloud secrets create SUPABASE_URL \
|
|
181
|
+
--data-file=- \
|
|
182
|
+
--project=kinemotion-backend
|
|
183
|
+
|
|
184
|
+
# Set Anon key secret (optional, for Auth server fallback)
|
|
185
|
+
echo -n "sb_publishable_xxxxxxxxxxxxxxxxxxxxx" | \
|
|
186
|
+
gcloud secrets create SUPABASE_ANON_KEY \
|
|
187
|
+
--data-file=- \
|
|
188
|
+
--project=kinemotion-backend
|
|
189
|
+
|
|
190
|
+
# Grant Cloud Run service account access to secrets
|
|
191
|
+
gcloud secrets add-iam-policy-binding SUPABASE_URL \
|
|
192
|
+
--member="serviceAccount:github-actions-deploy@kinemotion-backend.iam.gserviceaccount.com" \
|
|
193
|
+
--role="roles/secretmanager.secretAccessor" \
|
|
194
|
+
--project=kinemotion-backend
|
|
195
|
+
|
|
196
|
+
gcloud secrets add-iam-policy-binding SUPABASE_ANON_KEY \
|
|
197
|
+
--member="serviceAccount:github-actions-deploy@kinemotion-backend.iam.gserviceaccount.com" \
|
|
198
|
+
--role="roles/secretmanager.secretAccessor" \
|
|
199
|
+
--project=kinemotion-backend
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Step 2: Update `.github/workflows/deploy-backend.yml`**
|
|
203
|
+
|
|
204
|
+
Find the "Deploy to Cloud Run" step and update the `flags` section:
|
|
205
|
+
|
|
206
|
+
```yaml
|
|
207
|
+
- name: Deploy to Cloud Run
|
|
208
|
+
uses: google-github-actions/deploy-cloudrun@v3
|
|
209
|
+
with:
|
|
210
|
+
service: ${{ env.SERVICE_NAME }}
|
|
211
|
+
region: ${{ env.GCP_REGION }}
|
|
212
|
+
image: ${{ env.REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.SERVICE_NAME }}:${{ github.sha }}
|
|
213
|
+
flags: |
|
|
214
|
+
--memory=2Gi
|
|
215
|
+
--allow-unauthenticated
|
|
216
|
+
--set-env-vars=CORS_ORIGINS=https://kinemotion.vercel.app,JSON_LOGS=true,LOG_LEVEL=INFO
|
|
217
|
+
--set-secrets=SUPABASE_URL=SUPABASE_URL:latest,SUPABASE_ANON_KEY=SUPABASE_ANON_KEY:latest
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Step 6: Test Locally
|
|
223
|
+
|
|
224
|
+
### Start Backend
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
cd backend
|
|
228
|
+
source .env # Load environment variables
|
|
229
|
+
uv run uvicorn kinemotion_backend.app:app --reload
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Start Frontend
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
cd frontend
|
|
236
|
+
yarn dev
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Test Authentication Flow
|
|
240
|
+
|
|
241
|
+
1. Open `http://localhost:5173`
|
|
242
|
+
2. Click "Sign Up"
|
|
243
|
+
3. Enter email and password
|
|
244
|
+
4. Check email for confirmation link
|
|
245
|
+
5. Click confirmation link
|
|
246
|
+
6. Sign in with credentials
|
|
247
|
+
7. Upload a video to test authenticated API call
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Step 7: Deploy to Production
|
|
252
|
+
|
|
253
|
+
### Deploy Backend
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
git add .
|
|
257
|
+
git commit -m "feat: add Supabase authentication"
|
|
258
|
+
git push origin main
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
GitHub Actions will automatically:
|
|
262
|
+
- Run tests
|
|
263
|
+
- Build Docker image
|
|
264
|
+
- Deploy to Cloud Run
|
|
265
|
+
- Configure with Supabase secrets
|
|
266
|
+
|
|
267
|
+
### Deploy Frontend
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
cd frontend
|
|
271
|
+
git push origin main
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Vercel will automatically:
|
|
275
|
+
- Build React app with Vite
|
|
276
|
+
- Deploy to production
|
|
277
|
+
- Use environment variables
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Verification
|
|
282
|
+
|
|
283
|
+
### Check Logs (Backend)
|
|
284
|
+
|
|
285
|
+
All requests will now include user information:
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
{
|
|
289
|
+
"event": "request_started",
|
|
290
|
+
"request_id": "abc123...",
|
|
291
|
+
"user_id": "a1b2c3d4-e5f6...",
|
|
292
|
+
"user_email": "coach@example.com",
|
|
293
|
+
"method": "POST",
|
|
294
|
+
"path": "/api/analyze"
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Test API Authentication
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
# Get token from browser console after sign in
|
|
302
|
+
# (Run in browser console: supabase.auth.getSession())
|
|
303
|
+
|
|
304
|
+
curl -X POST https://kinemotion-backend-xxx.run.app/api/analyze \
|
|
305
|
+
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
|
306
|
+
-F "file=@video.mp4" \
|
|
307
|
+
-F "jump_type=cmj"
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Troubleshooting
|
|
313
|
+
|
|
314
|
+
### "Invalid token" errors
|
|
315
|
+
|
|
316
|
+
**Cause:** Token expired or verification failed
|
|
317
|
+
|
|
318
|
+
**Fix:**
|
|
319
|
+
1. Tokens expire after 1 hour - sign in again
|
|
320
|
+
2. Check browser console for auth errors
|
|
321
|
+
3. Verify `SUPABASE_URL` is correct in backend env
|
|
322
|
+
|
|
323
|
+
### "JWKS verification failed" in logs
|
|
324
|
+
|
|
325
|
+
**Cause:** Project uses HS256 signing (legacy)
|
|
326
|
+
|
|
327
|
+
**This is normal!** The backend automatically falls back to Auth server verification.
|
|
328
|
+
|
|
329
|
+
**Fix (optional):**
|
|
330
|
+
- Set `SUPABASE_ANON_KEY` for faster fallback verification
|
|
331
|
+
- Or migrate to asymmetric keys: Supabase Dashboard → **Settings** → **JWT signing keys** → Click "Migrate JWT secret"
|
|
332
|
+
|
|
333
|
+
### "CORS error" from API
|
|
334
|
+
|
|
335
|
+
**Cause:** Backend not allowing frontend domain
|
|
336
|
+
|
|
337
|
+
**Fix:**
|
|
338
|
+
1. Verify `CORS_ORIGINS` includes your Vercel domain
|
|
339
|
+
2. Redeploy backend with correct environment variable
|
|
340
|
+
|
|
341
|
+
### Email confirmation not working
|
|
342
|
+
|
|
343
|
+
**Cause:** Supabase email settings
|
|
344
|
+
|
|
345
|
+
**Fix:**
|
|
346
|
+
1. Supabase Dashboard → Authentication → Email Templates
|
|
347
|
+
2. Verify "Confirm signup" template is enabled
|
|
348
|
+
3. Check spam folder for confirmation email
|
|
349
|
+
4. For development, check Supabase logs for email delivery status
|
|
350
|
+
|
|
351
|
+
### Backend not validating tokens
|
|
352
|
+
|
|
353
|
+
**Cause:** Missing `SUPABASE_URL` environment variable
|
|
354
|
+
|
|
355
|
+
**Fix:**
|
|
356
|
+
1. Check Cloud Run logs: `gcloud logging read --limit 50`
|
|
357
|
+
2. Look for "supabase_auth_not_configured" warning
|
|
358
|
+
3. Verify `SUPABASE_URL` secret is set in Google Secret Manager
|
|
359
|
+
4. Redeploy with correct secret configuration
|
|
360
|
+
|
|
361
|
+
### Tokens verified but user info empty
|
|
362
|
+
|
|
363
|
+
**Cause:** Auth server fallback returns minimal data
|
|
364
|
+
|
|
365
|
+
**Fix:**
|
|
366
|
+
1. This is normal for HS256 projects using fallback
|
|
367
|
+
2. `user_id` (sub) and `email` are always extracted
|
|
368
|
+
3. For full token claims, migrate to RS256 signing
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## Security Notes
|
|
373
|
+
|
|
374
|
+
1. **Never commit secrets to Git**
|
|
375
|
+
- Use `.env.local` (gitignored) for local development
|
|
376
|
+
- Use Secret Manager for production
|
|
377
|
+
|
|
378
|
+
2. **RS256 vs HS256 Security**
|
|
379
|
+
- **RS256 (recommended):** Uses public/private key pairs. Public key can't forge tokens.
|
|
380
|
+
- **HS256 (legacy):** Uses shared secret. Anyone with the secret can forge tokens.
|
|
381
|
+
- Supabase recommends RS256 for all new projects.
|
|
382
|
+
|
|
383
|
+
3. **Rate limiting**
|
|
384
|
+
- Backend has rate limiting (3 requests/minute per IP)
|
|
385
|
+
- Supabase free tier: 50,000 MAUs
|
|
386
|
+
|
|
387
|
+
4. **User data**
|
|
388
|
+
- User emails are logged (for audit trail)
|
|
389
|
+
- Consider privacy regulations (GDPR, CCPA)
|
|
390
|
+
- Add privacy policy if collecting user data
|
|
391
|
+
|
|
392
|
+
5. **Token verification**
|
|
393
|
+
- Tokens are verified via Supabase JWKS endpoint (RS256)
|
|
394
|
+
- Fallback to Auth server verification (HS256)
|
|
395
|
+
- Never verify tokens using JWT secret directly (deprecated)
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## Free Tier Limits
|
|
400
|
+
|
|
401
|
+
**Supabase Free Tier:**
|
|
402
|
+
- ✅ 50,000 monthly active users
|
|
403
|
+
- ✅ 500 MB database storage
|
|
404
|
+
- ✅ 2 GB bandwidth
|
|
405
|
+
- ✅ Unlimited API requests
|
|
406
|
+
- ✅ Social OAuth providers
|
|
407
|
+
|
|
408
|
+
**Cost after free tier:**
|
|
409
|
+
- Pro plan: $25/month (includes 100,000 MAUs)
|
|
410
|
+
- Additional MAUs: $0.00325 per MAU
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## Next Steps
|
|
415
|
+
|
|
416
|
+
- [ ] Add email templates customization
|
|
417
|
+
- [ ] Enable password reset flow
|
|
418
|
+
- [ ] Add social OAuth (Google, GitHub)
|
|
419
|
+
- [ ] Implement role-based access control
|
|
420
|
+
- [ ] Add user profile management
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## Support
|
|
425
|
+
|
|
426
|
+
- **Supabase Docs:** https://supabase.com/docs
|
|
427
|
+
- **Supabase Community:** https://github.com/supabase/supabase/discussions
|
|
428
|
+
- **Kinemotion Issues:** https://github.com/feniix/kinemotion/issues
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Auth Provider Comparison December 2025
|
|
3
|
+
type: note
|
|
4
|
+
permalink: authentication/auth-provider-comparison-december-2025-1
|
|
5
|
+
tags:
|
|
6
|
+
- authentication
|
|
7
|
+
- comparison
|
|
8
|
+
- supabase
|
|
9
|
+
- clerk
|
|
10
|
+
- pricing
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Auth Provider Comparison (December 2025)
|
|
14
|
+
|
|
15
|
+
### Chosen: Supabase
|
|
16
|
+
|
|
17
|
+
**Why:**
|
|
18
|
+
- 50,000 MAUs free tier (vs Clerk 10K)
|
|
19
|
+
- Works with `kinemotion.vercel.app` (Clerk requires custom domain)
|
|
20
|
+
- $0.00325/MAU after free tier (cheapest)
|
|
21
|
+
- Open source, includes Postgres
|
|
22
|
+
- Excellent Python/FastAPI support
|
|
23
|
+
|
|
24
|
+
### Clerk (Not Chosen)
|
|
25
|
+
**Reason**: Doesn't allow `*.vercel.app` domains for production
|
|
26
|
+
- Free: 10,000 MAUs
|
|
27
|
+
- Paid: $25/month + $0.02/MAU
|
|
28
|
+
- Best DX, fastest setup
|
|
29
|
+
- Native Vercel integration
|
|
30
|
+
|
|
31
|
+
### Auth0 (Not Recommended)
|
|
32
|
+
**Reason**: Too expensive
|
|
33
|
+
- Free: 25,000 MAUs
|
|
34
|
+
- Paid: $35/month + $0.07/MAU (10K users = $700/month!)
|
|
35
|
+
|
|
36
|
+
### Firebase Auth
|
|
37
|
+
- Free: 50,000 MAUs
|
|
38
|
+
- Cons: Google lock-in, phone auth costs extra
|
|
39
|
+
|
|
40
|
+
### Cost Projection (Supabase)
|
|
41
|
+
- 0-50K MAUs: $0/month
|
|
42
|
+
- 100 videos/day ≈ 1-2K MAUs/month
|
|
43
|
+
- **Well within free tier**
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Auth Providers Comparison December 2025
|
|
3
|
+
type: note
|
|
4
|
+
permalink: authentication/auth-providers-comparison-december-2025-1
|
|
5
|
+
tags:
|
|
6
|
+
- authentication
|
|
7
|
+
- comparison
|
|
8
|
+
- supabase
|
|
9
|
+
- clerk
|
|
10
|
+
- auth0
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
[{"text": "# Third-Party Auth Providers Comparison (December 2025)\n\n## For Kinemotion (Vercel + Cloud Run)\n\n| Provider | Free MAUs | Vercel | Backend | Best For |\n|----------|-----------|--------|---------|----------|\n| **Clerk** | 10,000 | \u2b50 Native | \u2705 Excellent | MVP Speed |\n| **Supabase** | 50,000 | \u2705 Good | \u2705 Excellent | Long-term Cost |\n| **Auth0** | 25,000 | \u2705 Good | \u2705 Excellent | Enterprise |\n| **Firebase** | 50,000 | \u2705 Good | \u2705 Good | Google ecosystem |\n\n## Decision: Supabase (Chosen)\n\n**Why Supabase:**\n- \u2705 Most generous free tier (50K MAUs)\n- \u2705 Works with `kinemotion.vercel.app` (Clerk doesn't)\n- \u2705 Open source (can self-host)\n- \u2705 Includes Postgres database\n- \u2705 Cheapest long-term ($0.00325/MAU)\n\n## Clerk (Not Chosen - Domain Restriction)\n\n**Clerk Issue (December 2025):**\n- Does NOT allow `*.vercel.app` domains for production\n- Requires custom domain\n- Otherwise: fastest setup, best DX\n\n**Free Tier:** 10,000 MAUs\n**Paid:** $25/month + $0.02/MAU over 10K\n\n## Auth0 (Not Recommended - Expensive)\n\n**Free Tier:** 25,000 MAUs\n**Paid:** $35/month for 500 MAUs, then $0.07/MAU\n**Example:** 10K users = $700/month \ud83d\ude31\n\n## Firebase Auth\n\n**Free Tier:** 50,000 MAUs (email/password/social)\n**Cons:** Google lock-in, phone auth costs extra\n\n## Cost Projection for Kinemotion\n\n**Supabase Pricing:**\n- 0-50K MAUs: $0/month\n- 50K-100K MAUs: $25/month (Pro plan)\n- 100K+ MAUs: $25 + ($0.00325 per additional MAU)\n\n**Estimated usage:**\n- 100 videos/day \u2248 1,000-2,000 MAUs/month\n- **Cost: $0** (well within free tier)\n\n## Implementation Status\n\n\u2705 **Supabase fully integrated** (December 2025)\n- Frontend: React + @supabase/supabase-js\n- Backend: FastAPI + JWT validation\n- Deployment: Vercel + Cloud Run\n- Logging: User ID in all requests", "type": "text"}]
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Supabase Authentication Quick Start
|
|
3
|
+
type: note
|
|
4
|
+
permalink: authentication/supabase-authentication-quick-start-1
|
|
5
|
+
tags:
|
|
6
|
+
- supabase
|
|
7
|
+
- authentication
|
|
8
|
+
- quickstart
|
|
9
|
+
- implementation
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Supabase Authentication - Quick Start
|
|
13
|
+
|
|
14
|
+
## ✅ Implementation Complete!
|
|
15
|
+
|
|
16
|
+
Supabase authentication has been fully integrated with both frontend and backend.
|
|
17
|
+
|
|
18
|
+
## What Was Implemented
|
|
19
|
+
|
|
20
|
+
### Frontend (React + Vite)
|
|
21
|
+
- ✅ Supabase client configuration (`src/lib/supabase.ts`)
|
|
22
|
+
- ✅ Authentication hook (`src/hooks/useAuth.ts`)
|
|
23
|
+
- ✅ Sign in/sign up component (`src/components/Auth.tsx`)
|
|
24
|
+
- ✅ Updated App.tsx with auth flow
|
|
25
|
+
- ✅ Auth token sent to backend in API requests
|
|
26
|
+
- ✅ CSS styling for auth UI
|
|
27
|
+
|
|
28
|
+
### Backend (FastAPI + Cloud Run)
|
|
29
|
+
- ✅ Supabase JWT validation (`src/kinemotion_backend/auth.py`)
|
|
30
|
+
- ✅ ES256/RS256 verification via JWKS endpoint (modern)
|
|
31
|
+
- ✅ Automatic fallback to Auth server for HS256 projects (legacy)
|
|
32
|
+
- ✅ Middleware extracts user ID from tokens (`middleware.py`)
|
|
33
|
+
- ✅ User ID automatically logged in all requests
|
|
34
|
+
- ✅ User email logged for audit trail
|
|
35
|
+
|
|
36
|
+
## Quick Setup Steps
|
|
37
|
+
|
|
38
|
+
### 1. Create Supabase Project
|
|
39
|
+
- Go to [database.new](https://database.new)
|
|
40
|
+
- Name: `kinemotion`, Region: closest, Plan: Free (50K MAUs)
|
|
41
|
+
|
|
42
|
+
### 2. Get Credentials
|
|
43
|
+
- Dashboard → Settings → API Keys
|
|
44
|
+
- Copy: Project URL + Publishable key (`sb_publishable_xxx`)
|
|
45
|
+
|
|
46
|
+
### 3. Configure Authentication
|
|
47
|
+
- Dashboard → Authentication → URL Configuration
|
|
48
|
+
- Site URL: `https://kinemotion.vercel.app`
|
|
49
|
+
- Redirect URLs: `https://kinemotion.vercel.app/**`, `http://localhost:5173/**`
|
|
50
|
+
|
|
51
|
+
### 4. Environment Variables
|
|
52
|
+
|
|
53
|
+
**Frontend (.env.local):**
|
|
54
|
+
```
|
|
55
|
+
VITE_SUPABASE_URL=https://project.supabase.co
|
|
56
|
+
VITE_SUPABASE_ANON_KEY=sb_publishable_xxx
|
|
57
|
+
VITE_API_URL=http://localhost:8000
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Backend (.env):**
|
|
61
|
+
```
|
|
62
|
+
SUPABASE_URL=https://project.supabase.co
|
|
63
|
+
SUPABASE_ANON_KEY=sb_publishable_xxx
|
|
64
|
+
LOG_LEVEL=INFO
|
|
65
|
+
JSON_LOGS=false
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 5. Production Deployment
|
|
69
|
+
|
|
70
|
+
**Google Cloud Secrets:**
|
|
71
|
+
```bash
|
|
72
|
+
./scripts/setup-supabase-production.sh
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Vercel Environment Variables:**
|
|
76
|
+
Add VITE_SUPABASE_URL, VITE_SUPABASE_ANON_KEY, VITE_API_URL
|
|
77
|
+
|
|
78
|
+
## Testing Results
|
|
79
|
+
- ✅ All 85 backend tests pass
|
|
80
|
+
- ✅ 0 type errors (pyright strict)
|
|
81
|
+
- ✅ 0 linting errors (ruff)
|
|
82
|
+
- ✅ Frontend type checking passes
|
|
83
|
+
|
|
84
|
+
## Files Changed
|
|
85
|
+
**Frontend:** package.json, src/lib/supabase.ts, src/hooks/useAuth.ts, src/components/Auth.tsx, src/App.tsx, src/index.css
|
|
86
|
+
**Backend:** pyproject.toml, src/kinemotion_backend/auth.py, src/kinemotion_backend/middleware.py
|
|
87
|
+
|
|
88
|
+
## Free Tier: 50,000 MAUs/month (well within capacity)
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Supabase Authentication Setup Guide
|
|
3
|
+
type: note
|
|
4
|
+
permalink: authentication/supabase-authentication-setup-guide-1
|
|
5
|
+
tags:
|
|
6
|
+
- supabase
|
|
7
|
+
- authentication
|
|
8
|
+
- setup-guide
|
|
9
|
+
- production
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Supabase Authentication Setup Guide
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
Kinemotion uses Supabase for authentication with JWT token validation, automatic user ID logging, and protected API endpoints.
|
|
16
|
+
|
|
17
|
+
## Modern Approach (December 2025)
|
|
18
|
+
|
|
19
|
+
**JWT Signing Keys:**
|
|
20
|
+
- **Modern**: ES256/RS256 (asymmetric) - JWKS endpoint verification
|
|
21
|
+
- **Legacy**: HS256 (symmetric) - Auth server fallback
|
|
22
|
+
|
|
23
|
+
**Backend support:** Tries JWKS first, falls back to Auth server automatically.
|
|
24
|
+
|
|
25
|
+
## Step 1: Create Supabase Project
|
|
26
|
+
|
|
27
|
+
1. Go to [database.new](https://database.new)
|
|
28
|
+
2. Fill in: Name (kinemotion), Password (generate), Region (us-east-1), Plan (Free)
|
|
29
|
+
3. Click "Create new project"
|
|
30
|
+
4. Wait ~2 minutes
|
|
31
|
+
|
|
32
|
+
**Note:** New projects (July 2025+) use ES256 automatically. Legacy projects: migrate via Settings → JWT signing keys → "Migrate JWT secret".
|
|
33
|
+
|
|
34
|
+
## Step 2: Get Credentials
|
|
35
|
+
|
|
36
|
+
Dashboard → Settings → API Keys:
|
|
37
|
+
- **Project URL**: `https://xxx.supabase.co`
|
|
38
|
+
- **Publishable key**: `sb_publishable_xxx...` (safe for frontend)
|
|
39
|
+
- **Secret key**: `sb_secret_xxx...` (server-side only)
|
|
40
|
+
|
|
41
|
+
**Key format change (2025):** New format is `sb_publishable_xxx`, legacy is JWT-style `eyJ...`.
|
|
42
|
+
|
|
43
|
+
## Step 3: Configure Authentication
|
|
44
|
+
|
|
45
|
+
### URL Configuration
|
|
46
|
+
- Path: Authentication → URL Configuration
|
|
47
|
+
- Site URL: `https://kinemotion.vercel.app`
|
|
48
|
+
- Redirect URLs: `https://kinemotion.vercel.app/**`, `http://localhost:5173/**`
|
|
49
|
+
|
|
50
|
+
### Email Provider
|
|
51
|
+
- Path: Authentication → Providers
|
|
52
|
+
- Email is enabled by default
|
|
53
|
+
|
|
54
|
+
## Step 4: Frontend Environment Variables
|
|
55
|
+
|
|
56
|
+
**Development (.env.local):**
|
|
57
|
+
```
|
|
58
|
+
VITE_SUPABASE_URL=https://project-id.supabase.co
|
|
59
|
+
VITE_SUPABASE_ANON_KEY=sb_publishable_xxx
|
|
60
|
+
VITE_API_URL=http://localhost:8000
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Production (Vercel):**
|
|
64
|
+
Add same variables via Settings → Environment Variables
|
|
65
|
+
|
|
66
|
+
## Step 5: Backend Environment Variables
|
|
67
|
+
|
|
68
|
+
**Development (.env):**
|
|
69
|
+
```
|
|
70
|
+
SUPABASE_URL=https://project-id.supabase.co
|
|
71
|
+
SUPABASE_ANON_KEY=sb_publishable_xxx # Optional, for Auth server fallback
|
|
72
|
+
LOG_LEVEL=INFO
|
|
73
|
+
JSON_LOGS=false
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Production (Cloud Run):**
|
|
77
|
+
1. Create secrets in Google Secret Manager
|
|
78
|
+
2. Grant IAM access to service account
|
|
79
|
+
3. Update deploy-backend.yml with --set-secrets flag
|
|
80
|
+
|
|
81
|
+
See full commands in detailed guide.
|
|
82
|
+
|
|
83
|
+
## Testing Locally
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# Backend
|
|
87
|
+
cd backend && uv run uvicorn kinemotion_backend.app:app --reload
|
|
88
|
+
|
|
89
|
+
# Frontend
|
|
90
|
+
cd frontend && yarn dev
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Open http://localhost:5173 → Sign up → Confirm email → Sign in → Upload video
|
|
94
|
+
|
|
95
|
+
## Verification
|
|
96
|
+
Logs show: `user_id`, `user_email`, `request_id` in all requests
|
|
97
|
+
|
|
98
|
+
## Troubleshooting
|
|
99
|
+
- Invalid token: Re-sign in (tokens expire after 1 hour)
|
|
100
|
+
- JWKS failed: Normal for HS256, backend uses fallback
|
|
101
|
+
- CORS error: Check CORS_ORIGINS includes Vercel domain
|
|
102
|
+
|
|
103
|
+
## Security
|
|
104
|
+
- ES256: Public/private keys (can't forge tokens)
|
|
105
|
+
- HS256: Shared secret (anyone with it can forge) - deprecated
|
|
106
|
+
- Never commit .env files
|
|
107
|
+
- Use Secret Manager for production
|
|
108
|
+
|
|
109
|
+
## Free Tier: 50,000 MAUs/month
|
|
110
|
+
Pro: $25/month (100K MAUs), Additional: $0.00325/MAU
|