SS

Technical Documentation

Enter the 6-digit security code to continue.

PROPRIETARY & CONFIDENTIAL

SmartSwing AI Technical Documentation

Complete reference for the SmartSwing AI biomechanics analysis engine — covering every formula, correlation, analysis workflow, scoring model, grip inference algorithm, and architectural decision that powers the platform. This document serves as the "central brain" backup of the proprietary analyzer.

Last updated: April 8, 2026  |  Engine version: 2.0  |  Author: SmartSwing AI Engineering

Technical Architecture

SmartSwing AI is a multi-page static web application with serverless backend functions, designed for real-time biomechanical analysis in the browser.

Stack Components
LayerTechnologyPurpose
FrontendHTML + CSS + Vanilla JSZero-framework, maximum compatibility
Pose DetectionMoveNet / MediaPipe (17-keypoint)Real-time body landmark tracking
Biomechanicsadvanced-biomechanics-engine.jsJoint angles, kinematics, scoring
Grip Analysisgrip-analysis-engine.jsGrip inference from body kinematics
Stateapp-data.js (SmartSwingStore)Client-side store + Supabase sync
HostingVercelStatic hosting + serverless functions
DatabaseSupabase (PostgreSQL)Auth, profiles, assessments, reports
PaymentsStripeHosted checkout + webhook sync
AI CoachClaude API (Anthropic)Personalized coaching narratives

Data Flow Pipeline

Analysis Pipeline (End-to-End)
Video Input (upload / YouTube URL / webcam)
    |
    v
Pose Detection (MoveNet Thunder / MediaPipe)
    |  Outputs: 17 keypoints × N frames
    |  Each keypoint: { x, y, score }
    v
Frame Processing (per-frame metrics)
    |  Joint angles, velocities, rotations
    |  Head stability, balance, COM tracking
    v
Contact Frame Detection (peak wrist speed)
    v
Grip Analysis Engine (5 indicators → Gaussian classifier)
    |  Output: detected_grip, confidence, distribution
    v
Sequence Analysis (kinematic chain, power, efficiency)
    v
Session Aggregation (means, stdDevs, ranges)
    v
Scoring Pipeline (component → weighted → overall)
    |  Level-adjusted benchmarks, grade, percentile
    v
AI Coach Narrative (Claude API call)
    v
Report Generation (HTML template assembly)
    v
Persistence (localStorage + Supabase cloud sync)

Keypoint Model (MoveNet 17-Point)

SmartSwing uses the MoveNet Thunder model (or MediaPipe equivalent) that produces 17 body keypoints per frame. Each keypoint provides (x, y, confidence_score).

IndexKeypointBody PartUsage
0NOSEHeadHead stability tracking
1LEFT_EYEHeadHead orientation
2RIGHT_EYEHeadHead orientation
3LEFT_EARHeadHead rotation proxy
4RIGHT_EARHeadHead rotation proxy
5LEFT_SHOULDERUpper bodyShoulder rotation, joint angles
6RIGHT_SHOULDERUpper bodyShoulder rotation, joint angles
7LEFT_ELBOWArmElbow angle, kinematic chain
8RIGHT_ELBOWArmElbow angle, kinematic chain
9LEFT_WRISTArmRacquet speed proxy, grip analysis
10RIGHT_WRISTArmRacquet speed proxy, grip analysis
11LEFT_HIPCoreHip rotation, COM, balance
12RIGHT_HIPCoreHip rotation, COM, balance
13LEFT_KNEELower bodyKnee bend, power generation
14RIGHT_KNEELower bodyKnee bend, power generation
15LEFT_ANKLELower bodyFootwork, base width, balance
16RIGHT_ANKLELower bodyFootwork, base width, balance

Dominant side is auto-detected by comparing confidence score sums for left vs right arm keypoints. Minimum keypoint confidence threshold: 0.3.

Calibration (Pixel-to-Metric Conversion)

Auto-Calibration (Player Height)

Calibration Formula
heightPixels = |shoulder.y - ankle.y|
estimatedTorsoHeight = 0.9 m
pixelsToMeters = 0.9 / heightPixels

Manual Calibration (Court Lines)

Manual Override
pixelsToMeters = realWorldDistance / pixelDistance

Core Geometry Formulas

Euclidean Distance

distance(A, B)
d = sqrt( (B.x - A.x)^2 + (B.y - A.y)^2 )

3-Point Angle

angle3Points(A, B, C) — angle at vertex B
u = B → A = (A.x - B.x, A.y - B.y)
v = B → C = (C.x - B.x, C.y - B.y)
cos(angle) = dot(u, v) / (|u| × |v|)
angle = acos( clamp(cos, -1, 1) ) × (180 / pi)

Signed Angle (Rotation)

signedAngle(u, v)
cross = u.x × v.y - u.y × v.x
angle = atan2(cross, dot(u, v)) × (180 / pi)

Velocity Calculation

Keypoint Velocity (m/s → mph)
distPixels = distance(wrist[t-1], wrist[t])
distMeters = distPixels × pixelsToMeters
speedMS = distMeters / timeDelta // timeDelta default = 1/30 s
speedMPH = speedMS × 2.237
speedKPH = speedMS × 3.6

Joint Angle Calculations

All joint angles use the 3-point angle formula with the joint as vertex B:

JointPoint AVertex BPoint COptimal Range
ElbowShoulderElbowWrist140-170 deg
ShoulderHipShoulderElbow80-120 deg
HipShoulderHipKnee150-175 deg
KneeHipKneeAnkle145-165 deg

Angular velocity is calculated between consecutive frames:

Angular Velocity
angularVelocity = (angle[t] - angle[t-1]) / timeDelta // deg/s

Rotations & X-Factor

Hip Rotation

Hip line angle vs horizontal
hipLine = leftHip → rightHip
hipRotation = signedAngle(hipLine, horizontalAxis)

Shoulder Rotation

Shoulder line angle vs horizontal
shoulderLine = leftShoulder → rightShoulder
shoulderRotation = signedAngle(shoulderLine, horizontalAxis)

X-Factor (Hip-Shoulder Separation)

Key Power Indicator
separation = |shoulderRotation - hipRotation|
xFactor = abs( wrapAngle(separation) )
Optimal range: 30-50 degrees

The X-Factor measures the rotational separation between hips and shoulders during the swing. Greater separation stores elastic energy in the trunk musculature, enabling more powerful rotation through the kinetic chain. Professional players typically achieve 40-55 degrees of X-Factor at peak loading.

Trunk Tilt

Lateral Body Tilt
hipMid = midpoint(leftHip, rightHip)
shoulderMid = midpoint(leftShoulder, rightShoulder)
verticalRef = (hipMid.x, hipMid.y - 100)
trunkTilt = angle3Points(verticalRef, hipMid, shoulderMid)

Stability & Balance

Center of Mass (COM)

Weighted COM Approximation
shoulderMid = midpoint(leftShoulder, rightShoulder)
hipMid = midpoint(leftHip, rightHip)
COM.x = 0.4 × shoulderMid.x + 0.6 × hipMid.x
COM.y = 0.4 × shoulderMid.y + 0.6 × hipMid.y
// Hips weighted 60%, shoulders 40%

Head Stability (Rolling Window = 10 frames)

Stability Score
variance = sum(pixelOffset^2) / historyLength
stability = max(0, 100 - variance)
displacement = sqrt(variance) × pixelsToMeters × 100 // in cm

Balance Score

COM vs Base of Support
baseWidth = |rightAnkle.x - leftAnkle.x|
anklesMidX = (rightAnkle.x + leftAnkle.x) / 2
comOffset = |COM.x - anklesMidX|
balanceRatio = 1 - (comOffset / (baseWidth / 2))
balanceScore = max(0, min(100, balanceRatio × 100))

Kinematic Chain Sequencing

The kinetic chain principle states that efficient power transfer requires proximal-to-distal activation: hips first, then shoulders, then elbow, then wrist. SmartSwing detects peak velocity timing for each segment.

Peak Velocity Detection
For each segment (hip, shoulder, elbow, wrist):
  peakIdx = argmax(velocity[segment]) across all frames

Delays:
  hipToShoulder = peakShoulder - peakHip
  shoulderToElbow = peakElbow - peakShoulder
  elbowToWrist = peakWrist - peakElbow

Proper sequence: ALL delays > 0
efficiency = 100 if proper, else 50

Contact Point Quality

Contact Position (Dominant Hand)
inFront = wrist.x > hip.x // for right-handed; flipped for left
distance = |wrist.x - hip.x| × pixelsToMeters × 100 // cm

Optimal range: 25-45 cm in front
quality = 100 if optimal
quality = max(0, 100 - |distance - 35| × 2) if outside

Power Generation Score

Composite score from three weighted factors:

Factor 1: X-Factor Score
Optimal: 30-50 degrees
xScore = 100 if in range
xScore = max(0, 100 - |xFactor - 40| × 2) if outside
Factor 2: Knee Angle Score
Optimal: 145-165 degrees
kneeScore = 100 if in range
kneeScore = max(0, 100 - |kneeAngle - 155|) if outside
Factor 3: Racquet Speed Score
Baseline: 85 mph
speedScore = min(100, (maxRacquetSpeed / 85) × 100)
Final Power Score
powerScore = average(xScore, kneeScore, speedScore)

Efficiency Score

Deduction-Based Scoring
baseScore = 100

Deductions:
  Poor kinematic sequence: -20
  Low balance (< 70): -(70 - balance) × 0.5
  High head displacement (> 5 cm): -displacement

efficiencyScore = max(0, min(100, baseScore - deductions))

Overall Score Calculation

Component Weighting (Default)

Raw Score Formula
rawScore = biomechanics × 0.62
         + timing × 0.14
         + footwork × 0.08
         + positioning × 0.08
         + readiness × 0.08

Level Adjustment

Floor + Boost
Minimum floors: Beginner = 30, Intermediate = 40, Advanced = 50
Profile boost: Beginner = 1.0x, Intermediate = 1.05x, Advanced = 1.10x

adjustedScore = max(floor, rawScore × boost)
progressBonus = min(5, improvement_delta) // up to +5 pts
overallScore = min(100, adjustedScore + progressBonus)

Component Scores

ComponentWeightInputs
Biomechanics62%Racquet speed, acceleration, wrist lag, knee bend, shoulder/hip rotation
Timing14%Contact timing consistency vs optimal swing phase
Footwork8%Stride length, base width, movement smoothness
Positioning8%Distance from baseline, angle to ball, recovery position
Readiness8%Preparation time, racket position pre-contact, stance

Each component uses scoreMetricAgainstBenchmark() with three deviation windows:

  • Soft (within 20%): Score 80-100
  • Good (within 15%): Score 60-80
  • Fair (within 10%): Score 40-60

Shot-Type Scoring Models

Each shot type uses custom component weights (via SHOT_SCORING_MODELS):

Shot TypeBiomechanicsTimingPositioningFootworkReadiness
Forehand70%10%10%5%5%
Backhand65%12%12%6%5%
Serve75%15%5%3%2%
Volley60%20%10%5%5%
Slice68%12%10%5%5%
Drop Shot55%20%15%5%5%
Lob58%15%18%5%4%

Grading & Percentiles

Letter Grade Thresholds

GradeScore RangeMeaning
A+95-100Elite execution
A90-94Excellent
B+85-89Very good
B80-84Good
C+75-79Above average
C70-74Average
D60-69Below average
F<40Needs significant work

Percentile Calculation

Hyperbolic Tangent Z-Score Transform
z = (playerScore - levelMean) / levelStdDev
percentile = 50 × (1 + tanh(z / 1.7))

Level shifts: Beginner +5%, Intermediate 0%, Advanced -5%

The 1.7 divisor compresses the distribution to match typical tournament bell curves, ensuring meaningful differentiation across the 0-100 percentile range.

Benchmark System

Level-Specific Tolerance Multipliers

LevelToleranceEffect
Beginner1.5xMore forgiving — wider acceptable range
Intermediate1.0xStandard benchmark expectations
Advanced0.7xStricter — narrow acceptable range

Additional adjustment factors:

  • AGE_ADJUSTMENTS: Modifies benchmark expectations by age bracket
  • GENDER_ADJUSTMENTS: Adjusts power-related benchmarks by gender

KPI Calculations

KPICalculationInterpretation
Timing ConsistencyStdDev of contact timing (ms) within benchmark windowLower = more consistent
Footwork EfficiencyStride length variance + base width consistencyLower variance = better
Positioning ScoreAvg distance from ideal court position, normalized 0-100Higher = better positioning
Contact HeightConsistency of strike height above court surfaceLower variance = better
Speed ConsistencyRacquet velocity StdDev as % of benchmark meanLower = more repeatable

Grip Analysis Engine

The grip analysis engine infers the player's grip type from body-only kinematic signals at the contact frame. Since MoveNet provides only body landmarks (no finger or hand detail), the engine uses five proxy indicators that correlate strongly with grip type according to biomechanics literature.

Key Innovation

Traditional grip detection requires high-resolution hand imaging. SmartSwing's approach uses inferential kinematics — the body's configuration at contact frame strongly constrains which grip the player must be using. For example, a Western forehand grip forces high wrist extension, elevated contact point, and steep swing plane — detectable from shoulder/elbow/wrist positions alone.

Contact Frame Detection

Peak Wrist Speed Method
For i = 1 to frames.length:
  speed[i] = distance(wrist[i-1], wrist[i]) / timeDelta[i]
contactIdx = argmax(speed)

timeDelta = (frames[i].timestamp - frames[i-1].timestamp) || (1/30)
Minimum: 3 frames required, wrist confidence >= 0.3

Five Kinematic Indicators

1. Wrist Extension Angle (degrees)

Forearm vs Hand Velocity Direction
forearm = elbow → wrist
handDir = avg wrist displacement over ±2 frames around contact
angle = |atan2(cross2(forearm, handDir), dot(forearm, handDir))|
If angle > 90: fold to (180 - angle)

Continental: 0-15 deg | Eastern: 15-25 deg | Semi-Western: 25-40 deg | Western: 40-60 deg

2. Contact Height Ratio (normalized)

Wrist Position Relative to Torso
heightRatio = (hip_y - wrist_y) / (hip_y - shoulder_y)

0 = wrist at hip level | 1 = wrist at shoulder | >1 = above shoulder
Continental → low contact | Western → high contact

3. Swing Plane Angle (degrees above horizontal)

6-Frame Lookback Trajectory
wristPath = wrist[contactIdx-6] → wrist[contactIdx]
swingPlane = atan2(deltaY_upward, |deltaX|)

Continental: ~5-15 deg | Western: ~40-55 deg

4. Elbow Angle at Contact (degrees, 0-180)

Standard 3-Point Angle
u = shoulder → elbow, v = elbow → wrist
elbowAngle = acos(clamp(dot(u,v) / (|u| × |v|), -1, 1))

Extended arm → larger angle (serve/volley) | Bent → smaller (Western forehand)

5. Forearm Pronation Proxy (normalized 0-1)

Forearm vs Trunk Angle
forearm = wrist - elbow
trunk = mean_hip - shoulder
angle = acos(clamp(dot(forearm, trunk) / (|forearm| × |trunk|), -1, 1))
pronation = clamp(angle / 90, 0, 1)

0 = parallel (neutral) | 1 = perpendicular (fully pronated)

Gaussian Classifier

Each grip type is modeled as a diagonal-covariance Gaussian in 5D indicator space. Classification scores are computed as the product of per-indicator Gaussian likelihoods:

Per-Indicator Gaussian Score
z = (observedValue - center) / sigma
gScore = exp(-(z^2) / 2)
Floor: max(0.01, gScore) // prevents single-indicator zero-killing
Per-Grip Total Score
gripScore = product( gScore(indicator[i]) ) for all valid indicators
Minimum 2 valid indicators required
Probability Distribution
distribution[grip] = gripScore[grip] / sum(all gripScores)
confidence = max(distribution) // rounded to 3 decimal places

Grip Parameter Tables

Each cell shows [center, sigma] for the Gaussian classifier.

Forehand Grips

GripWrist ExtHeightSwing PlaneElbowPronation
Continental[10, 8][0.45, 0.20][10, 10][165, 12][0.20, 0.20]
Eastern[20, 8][0.75, 0.15][20, 10][158, 12][0.40, 0.20]
Semi-Western[33, 10][0.95, 0.15][32, 10][148, 12][0.60, 0.20]
Western[50, 12][1.15, 0.20][48, 12][140, 12][0.80, 0.20]

Backhand Grips

GripWrist ExtHeightSwing PlaneElbowPronation
Continental[12, 8][0.55, 0.20][12, 10][165, 12][0.25, 0.20]
Eastern BH[22, 10][0.85, 0.18][22, 10][155, 14][0.45, 0.20]
Two-Handed BH[18, 10][0.85, 0.20][24, 12][150, 15][0.50, 0.25]

Serve Grips

GripWrist ExtHeightSwing PlaneElbowPronation
Continental[15, 10][1.35, 0.30][30, 20][155, 15][0.30, 0.25]
Eastern[25, 12][1.30, 0.30][28, 20][155, 15][0.45, 0.25]
Semi-Western[35, 14][1.25, 0.30][26, 20][150, 15][0.60, 0.25]

Shot-Grip Appropriateness Mapping

Shot TypeExpected GripsMismatches & Severity
ForehandEastern, Semi-Western, WesternContinental = medium
ServeContinentalEastern = high, Semi-W = critical, Western = critical
VolleyContinentalEastern = medium, Semi-W/Western = high
SliceContinentalEastern = medium, Semi-W/Western = high
Drop ShotContinentalEastern = medium, Semi-W/Western = high
BackhandContinental, Eastern BH, Two-HandedEastern = medium, Semi-W = medium, Western = high
Lob / ReturnAll grips acceptedNo mismatches

Permissive coaching mode: Grip mismatches generate coaching callouts but do NOT penalize the overall score. This ensures players receive actionable guidance without being unfairly scored.

Coaching Recommendations

The engine generates structured recommendations based on detected grip vs shot type:

Critical Mismatch Rules
TriggerRecommendationDrills
Serve + non-ContinentalSwitch to Continental — unlocks forearm pronation for slice/kick servesgrip-bevel-check-continental, shadow-serve-pronation-snap
Volley/Slice/Drop + non-ContinentalUse Continental — only grip for both FH+BH punch volleysgrip-bevel-check-continental, punch-volley-no-switch
Forehand + ContinentalMove to Eastern or Semi-Western — caps topspin ceilinggrip-bevel-check-eastern, low-to-high-shadow-swing
Forehand + Western (beginner)Consider Semi-Western — Western is difficult for low balls

Report Structure

The analysis report is generated as an HTML template assembled from session data:

  1. Session Header — Date, duration, shot count by type, overall grade
  2. Score Breakdown — Biomechanics, timing, footwork, positioning, readiness (bar charts)
  3. Grade Details — Per-shot-type grades with percentile rankings
  4. Grip Analysis — Detected grip, confidence, distribution bars, severity badge, coaching notes
  5. Benchmark Comparison — Player metrics vs profile-adjusted benchmarks
  6. Progress Context — Personal best tracking, session-over-session delta, streaks
  7. Milestone Achievements — Level-specific unlocked badges based on score thresholds
  8. KPI Summary — Timing consistency, footwork efficiency, positioning, contact height
  9. AI Coaching Narrative — Swing Story, Analogy, Feel This, Your Potential
  10. Tailored Drills — Shot-type-specific drills based on weakest component scores
  11. Tactical Suggestions — Pattern-based playing recommendations
  12. Consistency Analysis — Standard deviation visualization across metrics

AI Coach Narrative

SmartSwing uses Claude (Anthropic) to generate personalized coaching insights. The prompt includes session data, shot type, score, and player profile. The response follows a strict four-section format:

Narrative Format

Swing Story — 2-3 sentences describing what happened in plain English

The Analogy — One clear metaphor or everyday comparison (max 2 sentences)

Feel This — Specific physical sensation/cue for next practice (2-3 sentences)

Your Potential — One sentence about what's achievable in 2-4 weeks

Rules: Calibrate language to player level (beginner = simple analogies, pro = technical precision). Be honest but encouraging. Never use generic filler. Total: 150-220 words.

Stack & Hosting

ServiceProviderPurpose
HostingVercelStatic files + serverless /api/*.js
DatabaseSupabase (PostgreSQL)Auth, profiles, assessments, reports
StorageSupabase StorageBuckets: tennis-videos, analysis-reports
PaymentsStripeCheckout sessions + webhook sync
AIAnthropic (Claude)Coaching narratives
CI/CDGitHub ActionsAuto-deploy to Vercel on push

Database Schema (Supabase)

Core Tables

TablePurpose
profilesUser profiles, subscription_tier, stripe IDs, player settings
assessmentsSaved analysis results — scores, angles, metrics, grip_assessment (JSONB)
coach_sessionsBooked coaching sessions
contact_messagesContact form submissions
player_goalsPlayer-set improvement targets
progress_eventsTimeline entries (milestones, achievements)
drill_assignmentsAuto-generated drill plans from assessments
analysis_reportsFull report HTML/data
shot_benchmarksReference benchmarks by level/age/gender
drill_libraryCurated drill database
tactic_libraryTactical pattern database
customer_subscriptionsStripe subscription state mirror
report_usage_monthlyServer-authoritative free report quota

Grip Assessment Column

The assessments.grip_assessment column (JSONB) stores:

{
  "detected_grip": "semi-western",
  "confidence": 0.847,
  "distribution": { "continental": 0.02, "eastern": 0.11, ... },
  "indicators": { "wrist_extension": 31.4, "contact_height": 0.92, ... },
  "shot_match": { "expected": ["eastern","semi-western","western"], "severity": null },
  "recommendations": [{ "action": "maintain", "title": "...", "why": "...", "how_steps": [] }],
  "drill_ids": [],
  "contact_frame_index": 42,
  "handedness": "right",
  "notes": []
}

Auth & Billing Flow

Authentication

Supabase Auth handles email/password + Google/Apple OAuth. Flow: signup.htmlauth-callback.htmlwelcome.htmldashboard.html. Local browser fallback (demo mode) activates when Supabase config is missing.

Billing

Stripe Checkout sessions created via api/create-checkout-session.js. Webhook (api/stripe-webhook.js) updates Supabase profiles.subscription_tier. Client syncs via restoreSupabaseSession() on dashboard load.

Plan Definitions

PlanReportsDrillsCoaching
Free3 lifetimeBasicNone
Starter10/monthFull libraryAI coach
ProUnlimitedFull + customAI + human
EliteUnlimitedFull + customPriority 1-on-1

Academic References & Studies

The SmartSwing AI engine draws from established sports biomechanics research:

Pose Estimation & Motion Analysis

  1. Cao, Z. et al. (2019) — "OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields." IEEE TPAMI. Foundation for real-time multi-keypoint body tracking.
  2. Google Research (2021) — "MoveNet: Ultra fast and accurate pose detection model." TensorFlow Hub. The primary pose model used by SmartSwing for 17-keypoint detection.
  3. Bazarevsky, V. et al. (2020) — "BlazePose: On-device Real-time Body Pose tracking." CVPR Workshop. Alternative MediaPipe pose model for cross-platform fallback.

Tennis Biomechanics

  1. Elliott, B. (2006) — "Biomechanics and Tennis." British Journal of Sports Medicine, 40(5). Comprehensive review of tennis stroke mechanics, kinetic chain principles, and injury prevention. Key source for joint angle benchmarks and optimal ranges.
  2. Reid, M., Elliott, B., & Crespo, M. (2013) — "Mechanics and Learning Practices Associated with the Tennis Forehand: A Review." Journal of Sports Science & Medicine, 12(2). Source for forehand grip-specific mechanics and wrist extension patterns.
  3. Knudson, D. & Blackwell, J. (2005) — "Upper Extremity Angular Kinematics of the One-Handed Backhand Drive in Tennis Players With and Without Tennis Elbow." International Journal of Sports Medicine. Elbow angle and wrist lag benchmarks for backhand analysis.
  4. Abrams, G. et al. (2011) — "Biomechanics of the Tennis Serve." Sports Health, 3(6). Serve kinematic chain timing, shoulder rotation, and pronation mechanics. Foundation for serve-specific scoring weights and Continental grip enforcement.
  5. Landlinger, J. et al. (2010) — "Key Performance Indicators for Tennis." Journal of Sports Science & Medicine, 9. Source for KPI definitions and benchmark calibration across skill levels.

Grip Biomechanics

  1. Groppel, J.L. (1992) — "High Tech Tennis." Leisure Press. Foundational reference on grip mechanics and their effect on ball contact, spin production, and shot selection.
  2. Brody, H. (2002) — "The Physics and Technology of Tennis." Racquet Tech Publishing. Physics of grip pressure, wrist action, and contact geometry. Source for grip-contact height correlations.
  3. Vergauwen, L. et al. (1998) — "Wrist and Forearm Muscle Activity in Tennis." British Journal of Sports Medicine, 32. EMG studies of forearm pronation across grip types. Foundation for the pronation proxy indicator.

Kinetic Chain & Power Transfer

  1. Kibler, W.B. (1995) — "Biomechanical Analysis of the Shoulder During Tennis Activities." Clinics in Sports Medicine, 14(1). Hip-shoulder separation (X-Factor) research and proximal-to-distal sequencing principles.
  2. Fleisig, G. et al. (2003) — "Kinematic and Kinetic Comparison Between Baseball Pitching and Football Passing." Journal of Applied Biomechanics. Cross-sport validation of kinetic chain principles applied to tennis serve mechanics.
  3. Putnam, C.A. (1993) — "Sequential Motions of Body Segments in Striking and Throwing Skills." Journal of Biomechanics, 26. Theoretical foundation for proximal-to-distal activation sequencing used in kinematic chain scoring.

Scoring & Performance Assessment

  1. Hughes, M. & Franks, I. (2004) — "Notational Analysis of Sport." Routledge. Framework for performance quantification and statistical analysis in racquet sports.
  2. O'Donoghue, P. (2010) — "Research Methods for Sports Performance Analysis." Routledge. Methodological foundation for z-score percentile calculations and benchmark normalization.

Glossary

TermDefinition
X-FactorAngular separation between hip and shoulder rotation axes during the swing loading phase
Kinetic ChainSequential activation of body segments from proximal (hips) to distal (wrist) for power transfer
Contact FrameThe frame at which peak wrist speed occurs — proxy for ball-racquet contact moment
COMCenter of Mass — weighted average of shoulder and hip midpoints (40/60 split)
PronationInward rotation of the forearm — critical for serve power and spin
Continental GripBase knuckle on bevel 2 — the universal grip for serves, volleys, and slices
Semi-Western GripBase knuckle on bevel 4 — default modern forehand grip for topspin
Swing PlaneAngle of the racquet path relative to horizontal — steeper planes produce more topspin
SmartSwing ScoreComposite 0-100 metric combining biomechanics (62%), timing (14%), footwork (8%), positioning (8%), readiness (8%)
Diagonal CovarianceGaussian classifier that treats each indicator independently — assumes no cross-indicator correlation

SmartSwing AI — Proprietary & Confidential. This document is for internal engineering reference only.
Generated April 8, 2026. Engine v2.0.