Local-first · dual-camera · cloud optional. Combined architecture and version roadmap.
Start
V0.1
Offline PC
On-device
V0.2
Phone / stick
Full product
V1
Phone host
Scale
VX
Cloud server
CaptureTwo devices record independently — no streaming, no WiFi needed
Device A
iPhone / GoPro
Records to local storage 60fps · 4K Fence-mounted
Device B
iPhone / GoPro
Records to local storage 60fps · 4K Opposite fence
↓ copy video files to laptop after match ↓
Host — your PC / laptoppython pipeline.py — already written, run it now
Step 1
Audio sync
Cross-correlate audio tracks. Outputs offset in ms.
Step 2
Court calibration
Auto line detection. Homography per camera.
Step 3
Ball detection
TrackNetV2 on both videos.
Step 4
Triangulation
Fuse both cameras → 3D position + in/out.
↓ results saved locally ↓
Output — browser on PClocalhost:3000 after processing completes
Review
Court map + in/out
Heatmap · calls · trajectories
Export
JSON / CSV
Raw ball positions and bounce data
Why start here: Zero cost. No server, no WiFi, no streaming latency. The full pipeline is already written. Run it on the public TrackNet dataset today — no filming required. This is your testing and tuning ground before adding any infrastructure.
data flow
Video A (file)
→
sync_engine.py
→
court_detector.py
→
ball_detector.py
→
triangulator.py
Video B (file)
→
apply offset
→
homography B
→
detections B
↗
bounce_detector.py
→
in_out_judge.py
→
results.json
→
browser UI
CaptureDevice A hosts local hotspot + processes. No internet.
Device A (host)
iPhone 15 Pro+
Records own camera Receives B stream Runs pipeline locally Creates WiFi hotspot
Device B
iPhone / GoPro
Streams to Device A via local hotspot No internet needed
Processing on-deviceSame Python pipeline as V0.1 — ported to CoreML for iPhone
Runs
Full CV pipeline
Sync · court · ball Triangulation · in/out Live results
Serves
WebSocket to Device C
Any phone / tablet on same local network
↓ results to display ↓
Device CAny browser — phone, tablet, laptop on local network
Live
Court map + calls
Same UI as cloud version Fully offline
Optional server path (V0.2b): The same Python code from V0.1 deploys to Render free tier in one day. Post-match video upload → server processes → results returned. Add live streaming later when WiFi is reliable at your court. These are parallel paths — don't block on server before on-device works.
Capture — any hardware combinationiPhone + iPhone · iPhone + GoPro · fixed club cams
Option 1
iPhone + iPhone
Both fence-mounted 60fps · local hotspot Start here
Option 2
iPhone + GoPro
RTMP to Device A Weatherproof · wide FOV
Option 3
Fixed club cams
Permanent install QR code to start session
↓ local WiFi hotspot ↓
Host — Device A (iPhone 15 Pro+)Runs full pipeline · serves results · creates hotspot
Sync
Audio + NTP
±1ms initial sync Corrects drift every 30s Re-sync after cam move
CV
Court + ball + 3D
Auto calibration TrackNetV2 tracking Triangulation
Decisions
In/out + scoring
Confidence scoring Serve logic Auto scoring (V2)
Output
Results API
WebSocket live REST post-match Livestream (V3)
↓ results to display ↓
Device C — any screenBrowser only · no install · iPhone · iPad · Surface · laptop
Match
Live court map
Ball placement · heatmap In/out calls · speed Height over net
Match (V2)
Scoring dashboard
Auto score Rally stats Match grading
Training (V3)
Analysis view
Swing · overlay Drill targets Bounce height
Post-match
Review
Close-call zoom Trajectory replay Share / export
CapturePhones stream only — no processing, battery preserved all match
Device A
iPhone / GoPro
Stream only WebRTC / RTMP
Device B
iPhone / GoPro
Stream only WebRTC / RTMP
↓ WebRTC / RTMP over WiFi or 5G ↓
Cloud server — GPU instanceAWS / Render · same Python pipeline · scales to multi-court
The key insight: V0.1 already runs the same Python pipeline. Upgrading to server is mostly DevOps — not rewriting CV code. The pipeline is identical; only the execution environment changes.
camera placement diagrams
Top-down — recommended camera positions
Side profile — mounting height vs court coverage
Ball trajectory + bounce detection (side view)
Training mode — drill targets + serve challenge
camera hardware combinations
V0.1 — start here
iPhone + iPhone
Already own these. Easiest to start. Good enough for V1 testing. Standard phone fence mounts.
iPhone + GoPro
Better weatherproofing. Wider FOV. RTMP stream. Best long-term outdoor setup.
Fixed cams (clubs)
Permanent install. QR login. Phones become Device C only. Club subscription model.
Spin detectionNeeds 120fps + dedicated ML model. Rotations per second + kick height after bounce.
Re-sync after moveOne clap re-aligns if a camera is nudged between sets. ~3 seconds.
Mounting experimentsTest: corner vs sideline, 1.5m vs 2.5m height, sun vs shade on different surfaces.
Racket A/B lab10 serves with racket A vs B. Speed, placement, bounce height comparison report.
Weather + GPSAuto-pull temp/humidity/wind on session date from device GPS. Performance vs conditions.
Pro overlay sharingUpload your swing as a reference model. Other users can compare against you.
Global leaderboardAmateur ranking verified by CourtIQ match data. Tournament bracket tool.
Padel (V2+)Wall bounces add geometry complexity. Court detection needs updating for glass walls.
Critical dependency: Every feature in V2+ depends on V1 ball tracking accuracy. If bounce position is wrong by >3cm, all downstream features — scoring, training overlay, racket lab — inherit that error. Get V0.1 accuracy right before building anything on top of it.